Selenium 3 常用API

2021-03-01 18:26

阅读:418

标签:好的   类型   jpg   int   释放   ubi   ice   exclude   dong   

元素定位

获取页面元素属性

元素判断

元素操作

操作输入框/单击

双击

下拉框操作

键盘操作

鼠标操作

单选框操作

多选框操作

拖动窗口

操作 JS 框 

切换 frame

使用 JS 操作页面对象

操作滚动条

浮动(联想)选项选择

更改页面对象的属性值

文件下载

文件上传

操作日期控件

操作富文本框

高亮显示操作元素

切换浏览器标签页

操作表格

测试 HTML5 的视频播放器

断言

截屏

隐式等待

显式等待

操作 cookies

页面加载超时

结束 Windows 的浏览器进程

浏览器相关配置

 

 

 

元素定位

 1 ‘‘‘ 使用id定位 ‘‘‘
 2 driver.find_element_by_id("id值")
 3 driver.find_element("id", "id值")  # 该方式可分离定位方式,更适合封装
 4 
 5 
 6 ‘‘‘ 使用xpath定位 ‘‘‘
 7 # 定位单个元素
 8 driver.find_element_by_xpath("xpath定位表达式")
 9 driver.find_element("xpath", "xpath定位表达式")
10 # 定位多个元素,返回列表
11 driver.find_elements_by_xpath("xpath定位表达式")
12 driver.find_elements("xpath", "xpath定位表达式")
13 
14 
15 ‘‘‘ 使用name定位 ‘‘‘
16 # 定位单个元素
17 driver.find_element_by_name("name值")
18 driver.find_element("name", "name值")
19 # 定位多个元素
20 driver.find_elements_by_name("name值")
21 driver.find_elements("name", "name值")
22 
23 
24 ‘‘‘ 使用classname定位 ‘‘‘
25 # 定位单个元素
26 driver.find_element_by_class_name("class属性值")
27 driver.find_element("classname", "class属性值")
28 # 定位多个元素
29 driver.find_elements_by_class_name("class属性值")
30 driver.find_elements("classname", "class属性值")
31 
32 
33 ‘‘‘ 使用标签名称定位 ‘‘‘
34 # 定位单个元素
35 driver.find_element_by_tag_name("标签名称")
36 driver.find_element("tagname", "标签名称")
37 # 定位多个元素
38 driver.find_elements_by_tag_name("标签名称")
39 driver.find_elements("tagname", "标签名称")
40 
41 
42 ‘‘‘ 使用链接的全部文字定位 ‘‘‘
43 # 定位单个元素
44 driver.find_element_by_link_text("链接全部本文内容")
45 driver.find_element("linktext", "链接全部本文内容")
46 # 定位多个元素
47 driver.find_elements_by_link_text("链接全部本文内容")
48 driver.find_elements("linktext", "链接全部本文内容")
49 
50 
51 ‘‘‘ 使用部分链接文字定位 ‘‘‘
52 # 定位单个元素
53 driver.find_element_by_partial_link_text("链接的部分本文内容")
54 driver.find_element("partial link text", "链接的部分本文内容")
55 # 定位多个元素
56 driver.find_elements_by_partial_link_text("链接的部分本文内容")
57 driver.find_elements("partial link text", "链接的部分本文内容")
58 
59 
60 ‘‘‘ 使用CSS方式定位 ‘‘‘
61 # 定位单个元素
62 driver.find_element_by_css_selector("CSS定位表达式")
63 driver.find_element("css selector", "CSS定位表达式")
64 # 定位多个元素
65 driver.find_elements_by_css_selector("CSS定位表达式")
66 driver.find_elements("css selector", "CSS定位表达式")

 

获取页面元素的属性信息

 1 from selenium import webdriver
 2 import time
 3 
 4 
 5 driver = webdriver.Chrome()
 6 driver.get("https://baidu.com")
 7 
 8 searchBox = driver.find_element_by_id(kw)
 9 element = driver.find_element_by_xpath("//a[text()=‘使用百度前必读‘]")
10 
11 # 元素的标签名
12 print(element.tag_name)
13 # 元素的大小
14 print(element.size)
15 # 元素的本文内容
16 print(element.text)
17 # 获取元素指定属性的值,等价于get_property())
18 print(element.get_attribute("name"))  # 如"name"、"value"等属性
19 
20 element = driver.find_element_by_id("kw")
21 element.send_keys("hippop")
22 print(element.get_attribute("value"))  # 获取输入框的值
23 
24 
25 # 获取页面元素的CSS属性值
26 searchBox = driver.find_element_by_id(kw)
27 print(searchBox.value_of_css_property("height"))
28 print(searchBox.value_of_css_property("width"))
29 
30 button = driver.find_element_by_id(su)
31 print(button.value_of_css_property("font-size"))   
32 print(button.value_of_css_property("font-family"))
33 
34 
35 time.sleep(3)
36 # driver.close()  # 关闭浏览器的当前tab窗口
37 driver.quit()  # 关闭浏览器

 

元素判断

判断元素是否存在

 1 from selenium import webdriver
 2 from selenium.webdriver import ActionChains
 3 import time
 4 
 5 
 6 driver = webdriver.Chrome()
 7 driver.get("http://www.baidu.com")
 8 
 9 
10 # 函数封装:判断元素是否存在
11 def isElementPresent(driver, by, value): 
12     try:
13         element = driver.find_element(by=by, value=value)
14     except NoSuchElementException as e:
15         # 打印异常信息
16         print(e)
17         # 发生了NoSuchElementException异常,说明页面中未找到该元素,返回False
18         return False
19     else:
20         # 没有发生异常,表示在页面中找到了该元素,返回True
21         return True
22 
23 if isElementPresent(driver, "id", "kw"):
24     driver.find_element_by_id("kw").send_keys("hiphop")
25 
26 
27 time.sleep(3)
28 driver.quit()  

element.is_displayed():判断元素是否可显示(未被隐藏)

 1 from selenium import webdriver
 2 import time
 3 
 4 
 5 driver = webdriver.Chrome()
 6 driver.get("http://39.100.104.214/test_visible.html")
 7 
 8 element = driver.find_element_by_id("div1")
 9 print(element.is_displayed())  # True
10 element = driver.find_element_by_id("div2")
11 print(element.is_displayed())  # False
12 
13 time.sleep(3)  # 休眠3秒后点击按钮,让元素隐藏
14 button = driver.find_element_by_id("button1")
15 button.click()
16 
17 element = driver.find_element_by_id("div1")
18 print(element.is_displayed())  # False
19 element = driver.find_element_by_id("div2")
20 print(element.is_displayed())  # True
21 
22 
23 time.sleep(2)
24 driver.quit() 

element.is_enabled():判断元素是否可用

 1 from selenium import webdriver
 2 import time
 3 
 4 
 5 driver = webdriver.Chrome()
 6 driver.get("http://39.100.104.214/test_enable.html")
 7 
 8 button = driver.find_element_by_id("input1")  # 可操作
 9 print(button.is_enabled())  # True
10 
11 button = driver.find_element_by_id("input2")  # 不可用(标签中加了"disabled"属性)
12 print(button.is_enabled())  # False
13 
14 button = driver.find_element_by_id("input3")  # 只读(标签中加了"readonly"属性)
15 print(button.is_enabled())  # True
16 
17 
18 time.sleep(2)
19 driver.quit() 

element_located_selection_state_to_be():判断一个元素的状态是否是给定的选择状态

方式1:element_selection_state_to_be(driverObject, state)

  • driverObject:定位器
  • state:期望的元素状态,True表示选中状态,False反之。相等返回True,否则返回False
 1 from selenium.webdriver.common.by import By
 2 from selenium.webdriver.support.ui import WebDriverWait
 3 from selenium.webdriver.support import expected_conditions as EC
 4 
 5 # 设置显式等待时间为10秒
 6 wait = WebDriverWait(driver, 10)
 7 
 8 # 判断给定的元素是否被选中
 9 # EC.element_selection_state_to_be(driverObject, state)
10 
11 # 设定元素当前选中状态为True
12 EC.element_selection_state_to_be(driver.find_element_by_id("peach"), True).is_selected  # 此句会先校验元素是否存在,不存在则抛异常
13 
14 # 显式等待元素是否为选中状态,若是选中状态则返回True,若超过10秒仍不为选中状态,则跑出异常(异常提示信息为:超时10秒)
15 wait.until(EC.element_selection_state_to_be(driver.find_element_by_id("peach"), True))
16 # 显式等待元素是否不为选中状态,若不为选中状态则返回False
17 wait.until_not(EC.element_selection_state_to_be(driver.find_element_by_id("peach"), True))

方式2:element_selection_state_to_be(locator, state)

  • locator:定位器,是一个元组 (by, path)
  • state:期望的元素状态,True表示选中状态,False反之。相等返回True,否则返回False
1 # 原型
2 EC.element_located_selection_state_to_be((By.ID, "peach"), True).is_selected  # 不会校验元素是否存在,返回True
3 # True
4 wait.until(EC.element_located_selection_state_to_be((By.ID, "peach"), True))
5 # Flase
6 wait.until_not(EC.element_located_selection_state_to_be((By.ID, "waterlemon"), True))

其他

element_to_be_clickable(locator):判断某元素是否可见且能被单击,满足则返回元素对象,否则返回False

1 # 存在并可见
2 wait.until(EC.element_to_be_clickable((By.ID, "")))
3 # 不存在
4 wait.until_not(EC.element_to_be_clickable((By.ID, "")))

frame_to_be_available_and_switch_to_it(parm):判断frame是否可用,如果可用返回True并切入到该frame

参数 parm 可以是:

  • 定位器 locator
  • 定位方式(id、name等)
  • 元素对象
  • frame 在页面中的索引值

invisibility_of_element_located(locator):希望某元素不出现在页面的DOM中

visibility_of_element_located(locator):希望某元素出现在页面的DOM中

1 element = wait.until(EC.visibility_of_element_located((By.ID, ""), True))
2 
3 element = EC.visibility_of(driver.find_element_by_id(""))
4 
5 # 判断页面上至少一个元素可见,返回满足条件的所有页面对象。
6 inputs = wait.until(EC.visibility_of_any_elements_located((By.TAG_NAME, "input")))

presence_of_all_elements_located(locator):判断页面上至少一个元素出现(不一定可见),返回满足条件的所有页面对象

1 elements = wait.until(EC.presence_of_all_elements_located((By.TAG_NAME, "input")))
2 # 判断单个元素出现(不一定可见)
3 element = wait.until(EC.presence_of_element_located((By.TAG_NAME, "input")))

staleness_of(driver.find_element_by_id(""):判断元素是否仍在DOM中,如果在规定时间内已经移除,返回True,反之False

text_to_be_present_in_element((By.ID, ""):判断文本内容text是否出现在某个元素中,判断的是元素的text

text_to_be_present_in_element_value(locator, text):判断文本内容text是否出现在某个元素的value属性值中

 

元素操作

操作输入框

  • 输入内容:element.send_keys()

  • 清空内容:element.clear()

单击:element.click()

 1 from selenium import webdriver
 2 import time
 3 
 4 driver = webdriver.Chrome()
 5 driver.get("https://baidu.com")
 6 time.sleep(2)
 7 
 8 searchBox = driver.find_element_by_id(kw)
 9 searchBox.send_keys("before")
10 
11 time.sleep(2)
12 
13 # 为了防止缓存的文字内容干扰测试结果,把输入框的内容先清空
14 searchBox.clear()
15 searchBox.send_keys("after")
16 
17 # 定位"百度一下"按钮
18 button = driver.find_element_by_id("su")
19 # 单击按钮
20 button.click()
21 
22 time.sleep(2)
23 driver.quit()

 

双击:action_chains.double_click(element).perform()

 1 from selenium import webdriver
 2 from selenium.webdriver import ActionChains
 3 import time
 4 
 5 
 6 driver = webdriver.Chrome()
 7 driver.get("http://39.100.104.214/test_doubleclick.html")
 8 time.sleep(2)
 9 
10 element = driver.find_element_by_id("inputBox")
11 
12 action_chains = ActionChains(driver)
13 # 双击元素
14 action_chains.double_click(element).perform()
15 
16 time.sleep(2)
17 driver.quit()

 

下拉框操作

单选

 1 from selenium import webdriver
 2 from selenium.webdriver.support.ui import Select
 3 import time
 4 
 5 
 6 driver = webdriver.Chrome()
 7 driver.get("http://39.100.104.214/test_select.html")
 8 
 9 
10 # 获取下拉框对象
11 select_element = Select(driver.find_element_by_xpath("//select"))
12 print(select_element)  
13 
14 # 打印默认选中的选项的文本
15 print(select_element.first_selected_option.text)
16 
17 # 获取所有的选项对象
18 all_options = select_element.options  
19 print(all_options)
20 
21 # 判断若第二个选项对象可用,并且没有被选中,就选中它
22 if all_options[1].is_enabled() and not all_options[1].is_selected():
23     # 方式1:通过索引来选择选项
24     select_element.select_by_index(1)
25     print (select_element.all_selected_options[0].text)
26     assert "西瓜"  in select_element.all_selected_options[0].text
27 
28 time.sleep(1)
29 # 方式2:通过文本来选择选项
30 select_element.select_by_visible_text("猕猴桃")  
31 assert "猕猴桃" in select_element.all_selected_options[0].text
32 
33 time.sleep(1)
34 # 方式3:通过value属性值来选择选项
35 select_element.select_by_value("shanzha")
36 assert "山楂" in select_element.all_selected_options[0].text
37 
38 time.sleep(2)
39 driver.quit()

封装下拉框操作

 1 from selenium import webdriver
 2 from selenium.webdriver.support.ui import Select
 3 import time
 4 
 5 
 6 # 根据xpath定位到下拉框对象,再根据选项的文本值选中指定选项
 7 def choose_option(driver, select_xpath, option_text):
 8         select = driver.find_element_by_xpath(select_xpath)
 9         all_options = select.find_elements_by_tag_name("option")
10         # 遍历所有选项对象
11         for option in all_options:
12             # print ("选项显示的文本:", option.text)
13             # print ("选项值为:", option.get_attribute("value"))
14             # 如果选项的文本值为入参,则选中
15             if option.text == option_text:
16                 option.click()
17                 return
18 
19 
20 driver = webdriver.Chrome()
21 driver.get("http://39.100.104.214/test_select.html")
22 
23 # 找到页面上name属性为“fruit”的下拉框对象,并选中"猕猴桃"选项
24 choose_option(driver, "//select[@name=‘fruit‘]", "猕猴桃")
25 
26 time.sleep(2)
27 driver.quit()

校验下拉框中的全部选项内容

 1 from selenium import webdriver
 2 from selenium.webdriver.support.ui import Select
 3 import time
 4 
 5 
 6 driver = webdriver.Chrome()
 7 driver.get("http://39.100.104.214/test_select.html")
 8 
 9 # 定位下拉框对象
10 select_element = Select(driver.find_element_by_xpath("//select"))
11 # 获取所有选项对象
12 actual_options = select_element.options
13 # 以列表形式获取所有选项的文本值
14 actual_options_text = [option.text for option in actual_options]
15 print(actual_options_text)
16 
17 expected_values = [桃子, 西瓜, 橘子, 猕猴桃, 山楂, 荔枝]
18 # 断言下拉框的选项内容是否全部相等
19 assert actual_options_text == expected_values
20 
21 
22 time.sleep(2)
23 driver.quit()

多选

 1 from selenium import webdriver
 2 from selenium.webdriver.support.ui import Select
 3 import time
 4 
 5 
 6 driver = webdriver.Chrome()
 7 driver.get("http://39.100.104.214/test_multiple_select.html")
 8 
 9 select_element = Select(driver.find_element_by_xpath("//select"))
10 actual_options = select_element.options
11 
12 # 和单选的下拉框一样,遍历所有的选项文字和value
13 for option in actual_options:
14     print(option.text)
15     print(option.get_attribute("value"))
16     if option.text == "桃子":  # 基于选项文本选择
17         option.click()
18     if option.get_attribute("value") == "lizhi":  # 基于value选择
19         option.click()
20 
21 # 打印所有被选中option的值
22 print("First choices:")
23 for option in select_element.all_selected_options:  
24     print (option.text)
25 
26 time.sleep(2)
27 select_element.select_by_index(1)  # 基于坐标选择
28 select_element.select_by_visible_text("荔枝")  # 基于选项文本选择
29 select_element.select_by_value("juzi")  # 基于value选择
30 select_element.deselect_all()  # 取消所有的选项
31 
32 # 打印所有被选中option的值
33 print("Second choices:")
34 for option in select_element.all_selected_options:  #
35     print (option.text)
36 
37 time.sleep(2)
38 select_element.select_by_index(1)
39 select_element.select_by_visible_text("荔枝")
40 select_element.select_by_value("juzi")  
41 
42 time.sleep(2)
43 select_element.deselect_by_visible_text("荔枝")  # 基于选项文本取消选择
44 select_element.deselect_by_index(1)  # 基于坐标取消选择
45 select_element.deselect_by_value("juzi")  # 基于value取消选择
46 
47 # 打印所有被选中option的值
48 print("Third choices:")
49 for option in select_element.all_selected_options:  #
50     print (option.text)
51 
52 
53 time.sleep(2)
54 driver.quit()

 

键盘操作

selenium 键盘操作

 1 from selenium import webdriver
 2 from selenium.webdriver.common.keys import Keys
 3 import time
 4 
 5 
 6 driver = webdriver.Chrome()
 7 driver.get("http://www.baidu.com")
 8 
 9 driver.find_element_by_id("kw").clear()  # 清空输入框
10 
11 driver.find_element_by_id("kw").send_keys("hiphop")  # 输入框内写入文本
12 driver.find_element_by_id("kw").send_keys(Keys.ENTER)  # 模拟键盘回车操作
13 
14 
15 time.sleep(5)
16 driver.quit()

系统键盘事件封装

  1 from selenium import webdriver
  2 from selenium.webdriver import ActionChains
  3 from selenium.webdriver.common.keys import Keys
  4 import win32clipboard as w
  5 import win32con
  6 import time
  7 import win32api
  8 
  9 
 10 # 读取剪切板
 11 def getText():
 12     w.OpenClipboard()
 13     d = w.GetClipboardData(win32con.CF_TEXT)
 14     w.CloseClipboard()
 15     return d
 16 
 17 
 18 # 设置剪切板内容
 19 def setText(aString):
 20     w.OpenClipboard()
 21     w.EmptyClipboard()
 22     w.SetClipboardData(win32con.CF_UNICODETEXT, aString)
 23     w.CloseClipboard()
 24 
 25 
 26 VK_CODE ={
 27     enter:0x0D,
 28     ctrl:0x11,
 29     a:0x41,
 30     v:0x56,
 31     x:0x58
 32     }
 33 
 34 
 35 # 键盘键按下
 36 def keyDown(keyName):
 37     win32api.keybd_event(VK_CODE[keyName], 0, 0, 0)
 38 
 39 
 40 # 键盘键抬起
 41 def keyUp(keyName):
 42     win32api.keybd_event(VK_CODE[keyName], 0, win32con.KEYEVENTF_KEYUP, 0)
 43 
 44 
 45 driver = webdriver.Chrome()
 46 url = "https://www.baidu.com"
 47 driver.get(url)
 48 content = 软件测试
 49 
 50 setText(content)  # 设置剪切板中文字内容为:‘软件测试‘
 51 getContent = getText()  # 获取剪切板中的内容
 52 print ("剪切板中的内容:", getContent.decode("gbk"))
 53 driver.find_element_by_id("kw").click()  # 点击输入框,使焦点保持在输入框中
 54 
 55 time.sleep(1)
 56 keyDown(ctrl)
 57 keyDown(v)
 58 # 释放 ctrl + v 组合键软件测试
 59 keyUp(v)
 60 keyUp(ctrl)
 61 
 62 driver.find_element_by_id(su).click()  # 点击搜索按钮
 63 
 64 time.sleep(3)
 65 driver.quit()
 66 
 67 #所有的键盘按钮定义
 68 ‘‘‘
 69 VK_CODE = {
 70     ‘backspace‘: 0x08,
 71     ‘tab‘: 0x09,
 72     ‘clear‘: 0x0C,
 73     ‘enter‘: 0x0D,
 74     ‘shift‘: 0x10,
 75     ‘ctrl‘: 0x11,
 76     ‘alt‘: 0x12,
 77     ‘pause‘: 0x13,
 78     ‘caps_lock‘: 0x14,
 79     ‘esc‘: 0x1B,
 80     ‘spacebar‘: 0x20,
 81     ‘page_up‘: 0x21,
 82     ‘page_down‘: 0x22,
 83     ‘end‘: 0x23,
 84     ‘home‘: 0x24,
 85     ‘left_arrow‘: 0x25,
 86     ‘up_arrow‘: 0x26,
 87     ‘right_arrow‘: 0x27,
 88     ‘down_arrow‘: 0x28,
 89     ‘select‘: 0x29,
 90     ‘print‘: 0x2A,
 91     ‘execute‘: 0x2B,
 92     ‘print_screen‘: 0x2C,
 93     ‘ins‘: 0x2D,
 94     ‘del‘: 0x2E,
 95     ‘help‘: 0x2F,
 96     ‘0‘: 0x30,
 97     ‘1‘: 0x31,
 98     ‘2‘: 0x32,
 99     ‘3‘: 0x33,
100     ‘4‘: 0x34,
101     ‘5‘: 0x35,
102     ‘6‘: 0x36,
103     ‘7‘: 0x37,
104     ‘8‘: 0x38,
105     ‘9‘: 0x39,
106     ‘a‘: 0x41,
107     ‘b‘: 0x42,
108     ‘c‘: 0x43,
109     ‘d‘: 0x44,
110     ‘e‘: 0x45,
111     ‘f‘: 0x46,
112     ‘g‘: 0x47,
113     ‘h‘: 0x48,
114     ‘i‘: 0x49,
115     ‘j‘: 0x4A,
116     ‘k‘: 0x4B,
117     ‘l‘: 0x4C,
118     ‘m‘: 0x4D,
119     ‘n‘: 0x4E,
120     ‘o‘: 0x4F,
121     ‘p‘: 0x50,
122     ‘q‘: 0x51,
123     ‘r‘: 0x52,
124 


评论


亲,登录后才可以留言!