Selenum核心技术
# 第二章 SE 核心技术
# 2.1 Selenium元素定位
要想操作Web界面上的元素,首先要定位到该元素,Selenium提供了定位元素的.这些方法都被定义在WebDriver类中,这些方法都以find开头例如: find_element_by_id,find_element_by_name等。本节我们就来看一下如何实现元位。
# 2.1.1 八大元素定位
| 序号 | 方法名称 | 描述 | 
|---|---|---|
| 1 | find_element_by_id | 通过id定位元素 | 
| 2 | find_element_by_xpath | 通过xpath定位元素 | 
| 3 | find_element_by_link_text | 通过连接文本定位元素 | 
| 4 | find_element_by_partial_link_text | 通过部分(模糊)链接文本定位 | 
| 5 | find_element_by_name | 通过标签名称定位 | 
| 6 | find_element_by_tag_name | 通过标签名称定位 | 
| 7 | find_element_by_class_name | 通过css class定位 | 
| 8 | find_element_by_css_selector | 通过css选择器 | 
test_locator.py
from selenium import webdriver
from time import sleep
# driver = webdriver.Chrome()
# driver.get('https://wwww.baidu.com')
# sleep(1)
# driver.maximize_window()
# driver.find_element_by_id('kw').send_keys('selenium')
# driver.find_element_by_id('su').click()
# sleep(5)
# driver.quit()
from selenium.webdriver.common.by import By
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('https://wwww.baidu.com')
        sleep(1)
    def test_id(self):
        self.driver.find_element_by_id('kw').send_keys('selenium')
        self.driver.find_element_by_id('su').click()
        sleep(2)
        # self.driver.quit()
    def test_name(self):
        self.driver.find_element_by_name('wd').send_keys('selenium')
        self.driver.find_element_by_id('su').click()
        sleep(2)
        self.driver.quit()
    def test_link_test(self):
        self.test_id()
        self.driver.find_element_by_link_text('百度首页').click()
        sleep(3)
        self.driver.quit()
    def test_partial_link_text(self):
        self.test_id()
        self.driver.find_element_by_partial_link_text('首页').click()
        sleep(3)
        self.driver.quit()
    def test_tag_name(self):
        # self.test_id()
        el = self.driver.find_elements_by_tag_name('input')[0]
        print(el)
        sleep(3)
        self.driver.quit()
    def test_class_name(self):
        self.driver.find_element_by_class_name('s_ipt').send_keys('selenium')
        self.driver.find_element_by_id('su').click()
        sleep(2)
        self.driver.quit()
    def test_xpath(self):
        self.driver.find_element_by_xpath('//*[@id="kw"]').send_keys('selenium')
        self.driver.find_element_by_xpath("//input[@id='su']").click()
        sleep(2)
        self.driver.quit()
    def test_css_selector(self):
        self.driver.find_element_by_css_selector("#kw").send_keys('selenium')
        self.driver.find_element_by_css_selector("#su").click()
        sleep(2)
        self.driver.quit()
    def test_find_element(self):
        self.driver.find_element(By.ID, value="kw").send_keys('selenium')
        self.driver.find_element(By.XPATH, "//input[@id='su']").click()
        sleep(2)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    # case.test_id()
    # case.test_name()
    # case.test_link_test()
    # case.test_partial_link_text()
    # case.test_tag_name()
    # case.test_class_name()
    # case.test_xpath()
    # case.test_css_selector()
    case.test_find_element()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# 2.1.2 WebDriver 相关属性
WebDriver类还有一些其他的常用属性和方法,这一节我们就来学习一下。
浏览器相关属性
| 属性 | 属性描述 | 
|---|---|
| driver.name | 浏览器名称 | 
| driver.current_url | 当前url | 
| driver.title | 当前页面标题 | 
| driver.page_source | 当前页面源码窗口句柄 | 
| driver.current_window_handle / driver.window_handles | 当前窗口所有句柄 | 
test_driver_property.py
from selenium import webdriver
from time import sleep
"""
浏览器的相关属性
"""
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('https://www.baidu.com')
    def test_property(self):
        print(self.driver.name)
        print(self.driver.title)
        print(self.driver.current_window_handle)
        print(self.driver.current_url)
        print(self.driver.get_window_size())
        print(self.driver.window_handles)
        # print(self.driver.page_source)
        self.driver.quit()
    def test_metho(self):
        self.driver.find_element_by_id("kw").send_keys("selenium")
        self.driver.find_element_by_id("su").click()
        sleep(3)
        self.driver.back()
        sleep(2)
        self.driver.refresh()
        sleep(2)
        self.driver.forward()
        sleep(2)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    # case.test_property()
    case.test_metho()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
浏览器相关方法
| 方法 | 描述 | 
|---|---|
| driver.back() | 后退 | 
| driver.forward() | 前进 | 
| driver.refresh() | 刷新页面 | 
| driver.close() | 关闭TAB页 | 
| driverquit() | 关闭浏览器 | 
| driver.switch_to.frame() | 切换进frame框架 | 
| driver.switch_to.alert | 切换到弹框 | 
| driver.switch_to.active_element | 切换到活动的元素上 | 
测试网站 (opens new window):http://sahitest.com/demo/
test_driver_method.py
from selenium import webdriver
from time import sleep
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('http://sahitest.com/demo')
    def test_element_property(self):
        self.driver.get('http://sahitest.com/demo/linkTest.htm')
        el = self.driver.find_element_by_id('t1')
        print("el->", el)
        print("el.id->", el.id)
        print("el.tag_name->", el.tag_name)
        print("el.rect->", el.rect)
        print("el.text->", el.text)
        print("el.size->", el.size)
        sleep(5)
        self.driver.quit()
    def test_element_method(self):
        self.driver.get('http://sahitest.com/demo/linkTest.htm')
        el = self.driver.find_element_by_id('t1')
        el.send_keys("Hello World")
        sleep(3)
        print(el.get_attribute('size'))
        print(el.get_attribute('type'))
        print(el.get_attribute('name'))
        print(el.get_attribute('value'))
        print(el.value_of_css_property('color'))
        print(el.value_of_css_property('font'))
        el.clear()
        sleep(3)
        form_element = self.driver.find_element_by_xpath("//body/form[1]")
        form_element.find_element_by_id('t1').send_keys("haha")
        el.clear()
        sleep(3)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    # case.test_element_property()
    case.test_element_method()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 2.3 Selenium WebElement
# 2.3.1 Selenium WebElement属性
当我们使用WebDriver的find方法定位到元素后,会返回一个WebElement对象,对象用来描述Web页面上的一个元素,这一节,我们就来看一下WebElement的常用届性和方法。
WebElement常用属性如下表所示。
| 属性 | 属性描述 | 
|---|---|
| id | 标示 | 
| size | 宽高 | 
| rect | 宽高和坐标 | 
| tag_name | 标签名称 | 
| text | 文本内容 | 
# 2.3.2 Selenium WebElement方法
接下来我们再来看一下 WebElement的相关方法,如下表所示
| 方法 | 方法描述 | 
|---|---|
| send_keys() | 输入内容 | 
| clear() | 清空内容 | 
| click() | 单击 | 
| get_attribute() | 获得属性值 | 
| is_selected() | 是否被选中 | 
| is_enabled() | 是否可用 | 
| is_displayed() | 是否显示 | 
| value_of_ css_property() | css属性值 | 
from selenium import webdriver
from time import sleep
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('http://sahitest.com/demo')
    def test_element_property(self):
        self.driver.get('http://sahitest.com/demo/linkTest.htm')
        el = self.driver.find_element_by_id('t1')
        print("el->", el)
        print("el.id->", el.id)
        print("el.tag_name->", el.tag_name)
        print("el.rect->", el.rect)
        print("el.text->", el.text)
        print("el.size->", el.size)
        sleep(5)
        self.driver.quit()
    def test_element_method(self):
        self.driver.get('http://sahitest.com/demo/linkTest.htm')
        el = self.driver.find_element_by_id('t1')
        el.send_keys("Hello World")
        sleep(3)
        print(el.get_attribute('size'))
        print(el.get_attribute('type'))
        print(el.get_attribute('name'))
        print(el.get_attribute('value'))
        print(el.value_of_css_property('color'))
        print(el.value_of_css_property('font'))
        el.clear()
        sleep(3)
        form_element = self.driver.find_element_by_xpath("//body/form[1]")
        form_element.find_element_by_id('t1').send_keys("haha")
        el.clear()
        sleep(3)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    # case.test_element_property()
    case.test_element_method()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 2.4 SE操作下拉列表
处理下拉列表,需要用到Selenium中的一个工具类Select,下面来看一下这个来中的常用方法。
| 方法/属性 | 方法/属性描述 | 
|---|---|
| select_by_value() | 根据值选择 | 
| select_by_index() | 根据索引选择 | 
| select_by_visible_text | 根据文本选择 | 
| deselect_by_value | 根据值反选 | 
| deselect_by_index | 根据索引反选 | 
| deselect_by_visible_text | 根据文本反选 | 
| deselect_all | 反选所有 | 
| options | 所有选项 | 
| all_selected_options | 所有选中选项 | 
| first_selected_option | 第一个选择选项 | 
 select.htmml
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>select test</title>
</head>
<body>
<form action="javascript:alert('test')">
province: <br />
    <select name="province" id="province">
        <option value="bj">Beijing</option>
        <option value="tj">Tianjin</option>
        <option value="sh">Shanghai</option>
        <option value="gd">Guangdong</option>
        <option value="sz">Shenzhen</option>
    </select> <br />
    <input type="submit" value="submit" id="submit">
</form>
</body>
</html>
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
test_select.py
from selenium import webdriver
from time import sleep
from pathlib import Path
from selenium.webdriver.support.select import Select
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        path = str(Path.cwd().joinpath('select.html'))
        file_path = 'file:' + path
        self.driver.get(file_path)
    def test_select(self):
        sel = self.driver.find_element_by_id('province')
        select = Select(sel)
        sleep(2)
        select.select_by_index(3)
        sleep(2)
        select.select_by_value('tj')
        sleep(2)
        select.select_by_visible_text("Shanghai")
        self.driver.find_element_by_id('submit').click()
        sleep(2)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    case.test_select()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
multi_select.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>select test</title>
</head>
<body>
<form action="javascript:alert('test')">
province: <br />
    <select name="province" id="province" multiple>
        <option value="bj">Beijing</option>
        <option value="tj">Tianjin</option>
        <option value="sh">Shanghai</option>
        <option value="gd">Guangdong</option>
        <option value="sz">Shenzhen</option>
    </select> <br />
    <input type="submit" value="submit" id="submit">
</form>
</body>
</html>
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
test_multi_select.py
from selenium import webdriver
from time import sleep
from pathlib import Path
from selenium.webdriver.support.select import Select
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        path = str(Path.cwd().joinpath('multi_select.html'))
        file_path = 'file:' + path
        self.driver.get(file_path)
    def test_multi_select(self):
        sel = self.driver.find_element_by_id('province')
        select = Select(sel)
        for index in range(len(select.options)):
            select.select_by_index(index)
            sleep(1)
        # 反选所有
        select.deselect_all()
        self.driver.find_element_by_id("submit").click()
        sleep(3)
        self.driver.quit()
    def test_options(self):
        sel = self.driver.find_element_by_id('province')
        select = Select(sel)
        for option in select.options:
            print(option.text)
        sleep(3)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    # case.test_multi_select()
    case.test_options()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 2.5 SE操作复选单选框
Form.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>checkbox radio test</title>
</head>
<body>
<form action="javascript:alert('hell form')">
    爱好1: <input type="checkbox" name="swimming", value="swimming" /> <br />
    爱好2: <input type="checkbox" name="basketball", value="basketball" /> <br />
<hr />
    男:<input type="radio" name="gender" value="male"/> <br />
    女:<input type="radio" name="gender" value="female"/> <br />
    <input type="submit" name="login" value="submit" style="background-color: aqua"/>
</form>
</body>
</html>
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from selenium import webdriver
from time import sleep
from pathlib import Path
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        path = str(Path.cwd().joinpath("form2.html"))
        form_path = "file:" + path
        self.driver.get(form_path)
    def test_checkbox(self):
        swimming = self.driver.find_element_by_name('swimming')
        if not swimming.is_selected():
            swimming.click()
        basketball = self.driver.find_element_by_name('basketball')
        if not basketball.is_selected():
            basketball.click()
        sleep(2)
        self.driver.find_element_by_name('login').click()
        sleep(1)
        self.driver.switch_to.alert.accept()
        sleep(1)
        if swimming.is_selected():
            swimming.click()
        sleep(2)
        self.driver.quit()
    def test_radio(self):
        gender_lst = self.driver.find_elements_by_name("gender")
        gender_lst[0].click()
        sleep(2)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    # case.test_checkbox()
    case.test_radio()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 2.6 SE操作Form表单
form表单是我们经常测试的用例,绝大多数Web程序都有这方面功能,例如:用户登录、注册都会用到form表单。本节为你讲述如何测试form表单。
form表单的是流程是这样的:
- 定位表单元素
 - 输入测试值
 - 判断表单元素属性
 - 获得表单元素属性
 - 提交表单进行验证
 
Form.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>form test</title>
</head>
<body>
<form action="javascript:alert('hello')">
    username <input type="text" name="username", id="username" /> <br />
    password <input type="password" name="pwd" id="pwd" /> <br />
    <input type="submit" name="submit", id="submit" value="submit">
</form>
</body>
</html>
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from selenium import webdriver
from pathlib import Path
from time import sleep
import os
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        path = str(Path.cwd().joinpath('form.html'))
        file_path = "file:" + path
        self.driver.get(file_path)
    def test_form(self):
        username = self.driver.find_element_by_id("username")
        username.send_keys("admin")
        pwd = self.driver.find_element_by_id("pwd")
        pwd.send_keys("123")
        print(username.get_attribute("value"))
        print(pwd.get_attribute("value"))
        sleep(1)
        self.driver.find_element_by_id("submit").click()
        sleep(1)
        print(self.driver.switch_to.alert.text)
        self.driver.switch_to.alert.accept()
        sleep(2)
        username.clear()
        pwd.clear()
        sleep(3)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    case.test_form()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 2.7 处理弹框
页面上的弹框有三种:
alert:用来提示
confirm:用来确认
prompt:输入内容
方法/属性 方法/属性描述接受 accept() 接受 dimis 取消 text 显示的文本 send_keys 输入内容 alert.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>alert-confirm-prompt test</title> </head> <body> <a href="javascript:alert('提示框')" id="alert">Alert</a> <br/><br/> <a href="javascript:confirm('确定要删除数据吗?')" id="confirm">Confirm</a><br/><br/> <a href="javascript: const age=prompt('请输入要删除的理由'); document.writeln(age)" id="prompt">Prompt</a><br/><br/> </body> </html>1
2
3
4
5
6
7
8
9
10
11
12import pyperclip from selenium import webdriver from time import sleep from pathlib import Path import pyautogui # from pykeyboard import PyKeyboard from selenium.webdriver.support.select import Select class TestCase(object): def __init__(self): self.driver = webdriver.Chrome() self.driver.maximize_window() path = str(Path.cwd().joinpath('alert.html')) file_path = 'file:' + path self.driver.get(file_path) def test_alert(self): sleep(3) self.driver.find_element_by_id('alert').click() alert = self.driver.switch_to.alert print(alert.text) sleep(3) alert.accept() sleep(3) self.driver.quit() def test_confirm(self): self.driver.find_element_by_id('confirm').click() confirm = self.driver.switch_to.alert print(confirm.text) # 确定动作 # confirm.accept() sleep(3) # 取消动作 confirm.dismiss() sleep(3) self.driver.quit() def test_prompt(self): self.driver.find_element_by_id('prompt').click() prompt = self.driver.switch_to.alert sleep(3) print(prompt.text) current_mousex, current_mousey = pyautogui.position() print(current_mousex, current_mousey) # 当光标默认在输入框时,直接输入 # pyautogui.typewrite("hello world") # 当光标默认不再输入框中要输入需要以下步骤,两种方法都行 input_image_path = '/Users/mac/PycharmProjects/seleniumEntireTutorial/tutorial/input.jpg' # 获取截图内容的坐标中心 方法一 # x, y = pyautogui.locateCenterOnScreen(input_image_path) # 鼠标移动到坐标处 # pyautogui.moveTo(x, y, duration=0.5) # 模拟鼠标左击 # pyautogui.leftClick(x=x, y=y) # 方法二: xy = pyautogui.locateOnScreen(input_image_path, confidence=0.9) center = pyautogui.center(xy) pyautogui.click(center) # 无法复制粘贴 sleep(1) chines = "你好" pyperclip.copy(chines) sleep(1) pyautogui.hotkey('command', 'v') # pyautogui.typewrite("弄好") current_mousex, current_mousey = pyautogui.position() print(current_mousex, current_mousey) sleep(2) try: # 根据图片定位在图片在屏幕上的中点 image_path = '/Users/mac/PycharmProjects/seleniumEntireTutorial/tutorial/queding.jpg' # ###### 鼠标点击确定按钮 start 方法一 ################### # 获取截图内容的坐标中心 # x, y = pyautogui.locateCenterOnScreen(image_path) # # 鼠标移动到坐标处 # pyautogui.moveTo(x, y, duration=0.5) # 模拟鼠标左击 # pyautogui.leftClick(x=x, y=y) # ###### 鼠标点击确定按钮 end 方法一 ################### # ###### 鼠标点击确定按钮 start 方法二 ################### xy = pyautogui.locateOnScreen(image_path, confidence=0.9) center = pyautogui.center(xy) pyautogui.click(center) # ###### 鼠标点击确定按钮 end 方法二 ################### # prompt.accept() current_mousex, current_mousey = pyautogui.position() print(current_mousex, current_mousey) except Exception as e: print(e) finally: sleep(3) self.driver.quit() if __name__ == '__main__': case = TestCase() # case.test_alert() # case.test_confirm() case.test_prompt()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# 2.8 SE三种等待
在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果不做任何处理的话,代码会由于没有找到元素而报错。
另外,一种情况就是页面使用ajax异步加载机制。这时我们就要用到wait,而在 Selenium中,我们可以用到一共三种等待,每一种等待都有自己的优点或缺点,下面我们就来学习下。
time.sleep(固定等待)
在开发自动化框架过程中,最忌讳使用python自带模块的time 的sleep方式进行等待,虽然可以自定义等待时间,但当网络条件良好时,依旧按照预设定的时间继续等待,导致整个项目的自动化时间无限延长,不建议使用。 (注:脚本调试过程时,还是可以使用的,方便快捷)
implicitly_wait (隐式等待) 隐式等待实际是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间结束,然后执行下一步。
隐式等待会有个坑,我们都知道JavaScript一般都是放在我们的body的最后进行加载,实际这是页面上的元素都已经加载完毕,我们却还在等待全部页面加载结束。
隐式等待对整个driver周期都起作用,在最开始设置一次就可以了。不要当作固定等待使用,到哪都来一下隐式等待。
WebDriverWait (显式等待) WebDriverWait是selenium提供得到显示等待模块引入路径:
from selenium. webdriver. support. wait import WebDriverWaitWebDriverWait参数
参数driver 参数说明 driver 传入WebDriver实例 timeout 超时时间,等待的最长时间 poll_frequency 调用unti或until_not中的方法的间隔时间,默认是0.5秒忽略的异常 ignored_exceptions 忽略异常 from selenium.webdriver.support.wait import WebDriverWait from selenium import webdriver from time import sleep from selenium.webdriver.support import expected_conditions as EC class TestCase(object): def __init__(self): self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://wwww.baidu.com') def test_sleep(self): sleep(2) self.driver.find_element_by_id('kw').send_keys('selenium') sleep(2) self.driver.find_element_by_id('su').click() sleep(3) self.driver.quit() def test_implicitly(self): self.driver.implicitly_wait(10) self.driver.find_element_by_id('kw').send_keys('selenium') self.driver.find_element_by_id('su').click() sleep(3) self.driver.quit() def test_webdriver_wait(self): try: wait = WebDriverWait(self.driver, 2, 0.3) wait.until(EC.title_is('百度一下,你就知道')) self.driver.find_element_by_id('kw').send_keys('selenium') self.driver.find_element_by_id('su').click() except Exception as e: print(e) finally: sleep(3) self.driver.quit() if __name__ == '__main__': case = TestCase() # case.test_sleep() # case.test_implicitly() case.test_webdriver_wait()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48- expected_conditions 17中等待条件
 
from selenium.webdriver.support import expected_conditions as EC
 | 等待条件 | 描述 | 返回值类型 | 
|---|---|---|
| title_is | 判断title,是否出现 | 布尔 | 
| title_contains | 判断title,是否包含某些字符 | 布尔 | 
| presence_of_element_located | 判断某个元素是否被加到了dom树里,并不代表该元素一定可见 | WebElement | 
| visibility_of_element_located | 判新某个元素是否被添加到dom里并且宽和高都大于0 | WebElement | 
| visibility_of | 判断元素是否可见,如果可见就返回这个元 | WebElement | 
| presence_of_all_elements_located | 判断是否至少有1个元素存在于dom树中 | 列表 | 
| visibility_of_any_elements_located | 判断是否至少有一个元素在页面中可见 | 列表 | 
| text_to_be_present_in_element | 判斯指定的元素中是否包含了预期的字符串 | 布尔 | 
| text_to_be_present_in_element_valve | 判断指定元素的属性值中是否包合了预期的字符串 | 布尔 | 
| frame_to_be_available_and_switchto_it | 判断iframe是否可以switch进去 | 布尔 | 
| invisibility_of_element_located | 判断某个元素在是否存在于dom或不可见 | 布尔 | 
| element_to_be_clickable | 判断某个元素中是否可见并且是enable的. 代表可点击 | 布尔 | 
| staleness_of | 等待某个元素从dom树中移除 | 布尔 | 
| element to_be selected | 判断某个元素是否被选中了,一般用在下拉列 | 布尔 | 
| element_selection_state_to_be | 判断某个元素的选中状态是否符合预期 | 布尔 | 
| element_located_selection_state_to_be | 判断某个元素的选中状态是否符合预期 | 布尔 | 
| aert_is_present | 判断页面上是否存在alert | alert | 
- Selenium中的鼠标和键盘事件被封装在ActionChains类中,正确的使用方法是:
ActionChains(driver).click(btn) . perform()下面列出ActionChains中常用方法: 
| 序号 | 方法 | 方法描述 | 
|---|---|---|
| 1 | click(on_element=None) | 单击鼠标左键 | 
| 2 | click and hold(on element=None) | 点击鼠标左键,不松开 | 
| 3 | context_click(on element-None) | 点击鼠标右键 | 
| 4 | double click(on element-None) | 双击鼠标左键 | 
| 5 | drag and_drop(source, target) | 拖搜到某个元素然后松开 | 
| 6 | drag and_drop.by_offset(source, xoffset, yoffset) | 拖搜到某个坐标然后松开 | 
| 7 | key_down(value, element-None) | 按下某个键盘上的键 | 
| 8 | key.up(value, element=None) | 松开某个键 | 
| 9 | move_by_offset(xoffset, yoffset) | 鼠标从当前位置移动到某个坐标 | 
| 10 | move_to_element(to.element) | 鼠标移动到某个元素 | 
| 11 | move_to_element_with_offset(to.element, xoffset, yoffset) | 动到距某个元素(左上角坐标)多距离的位置 | 
| 12 | perform() | 执行链中的所有动作 | 
| 13 | release(on element-None) | 在某个元素位置松开鼠标左键 | 
| 14 | send_keys(*keys_to_send) | 发送某个键到当前焦点的元素 | 
| 15 | send_keys_to_element(element, *keys to_send) | 发送某个键到指定元素 | 
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from pathlib import Path
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        path = str(Path.cwd().joinpath('wait.html'))
        file_path = 'file:' + path
        self.driver.get(file_path)
    def test_webdriver_wait(self):
        self.driver.find_element_by_id('btn').click()
        try:
            # 去掉这个显示等待或者等待时间比较短就会失败
            wait = WebDriverWait(self.driver, 3, 0.3)
            wait.until(EC.text_to_be_present_in_element((By.ID, 'id2'), 'id2'))
            print(self.driver.find_element_by_id('id2').text)
        except Exception as e:
            print(e)
        finally:
            sleep(3)
            self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    case.test_webdriver_wait()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 2.9 等待条件
    def test_webdriver_wait(self):
        self.driver.find_element_by_id('btn').click()
        try:
            # 去掉这个显示等待或者等待时间比较短就会失败
            wait = WebDriverWait(self.driver, 3, 0.3)
            wait.until(EC.text_to_be_present_in_element((By.ID, 'id2'), 'id2'))
            print(self.driver.find_element_by_id('id2').text)
        except Exception as e:
            print(e)
        finally:
            sleep(3)
            self.driver.quit()
 2
3
4
5
6
7
8
9
10
11
12
13
14
# 2.10 截图
# 2.10.1全屏截图
WebDriver内置了一些在测试中捕获屏幕并保存的方法:
| 方法 | 方法描述 | 
|---|---|
| save_screenshot(filename) | 获取当前屏幕截图并保存为指定文件, filename指指定保存的路径或者图片的文件名 | 
| get-screenshot_asbase64() | 获取当前屏幕截图base64编码字符串 | 
| get-screenshot-as_file(fimename) | 获取当前的屏幕截图,使用完整的路径 | 
| get_screenshot_as_png() | 获取当前屏幕截图的二进制文件数据 | 
test_screenshot.py
from selenium import webdriver
from time import sleep, strftime, localtime, time
from pathlib import Path
import os
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get("https://www.baidu.com")
    def test_save_picture(self):
        sleep(2)
        path = str(Path.cwd()) + r"/screenShoot/"
        format_time = strftime('%Y-%m-%d-%H-%M-%S', localtime(time()))
        file_path = path + format_time + '.png'
        self.driver.save_screenshot(file_path)
        path2 = os.path.abspath('screenShoot')
        file_name = format_time + '.jpg'
        file_path2 = path2 + '/' + file_name
        print(file_path2)
        sleep(3)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    case.test_save_picture()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 2.10.2 元素截图
 def test_screen_shoot_element(self):
        search_el = self.driver.find_element_by_id("kw")
        format_time = strftime('%Y-%m-%d-%H-%M-%S', localtime(time()))
        path2 = os.path.abspath('screenShoot')
        file_name = format_time + '.jpg'
        file_path2 = path2 + '/' + file_name
        search_el.screenshot(file_path2)
 2
3
4
5
6
7
8
9
# 2.11 JS脚本应用
from selenium import webdriver
from time import sleep
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get("https://www.baidu.com")
    def test_js(self):
        self.driver.execute_script('alert("Hello World")')
        sleep(2)
        self.driver.switch_to.alert.accept()
        sleep(3)
        self.driver.quit()
    def test_via_js_get_title(self):
        js = "return document.title"
        title = self.driver.execute_script(js)
        print(title)
        sleep(3)
        self.driver.quit()
    def test_modify_style(self):
        sleep(2)
        js = 'var q=document.getElementById("kw");q.style.border="2px solid red"'
        self.driver.execute_script(js)
        sleep(3)
        self.driver.quit()
    def test_scroll(self):
        self.driver.find_element_by_id('kw').send_keys('selenium')
        self.driver.find_element_by_id('su').click()
        sleep(2)
        js = "window.scrollTo(0, document.body.scrollHeight)"
        self.driver.execute_script(js)
        sleep(3)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    # case.test_js()
    # case.test_via_js_get_title()
    # case.test_modify_style()
    case.test_scroll()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# 2.12 鼠标和键盘事件
from selenium import webdriver
from time import sleep
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
class TestCase(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.driver.maximize_window()
        self.driver.get('http://sahitest.com/demo/clicks.htm')
    def test_mouse(self):
        sleep(2)
        double_btn = self.driver.find_element_by_xpath("//input[contains(@value,'dbl click me')]")
        ActionChains(self.driver).double_click(double_btn).perform()
        sleep(2)
        click_btn = self.driver.find_element_by_xpath("//input[@value='click me']")
        ActionChains(self.driver).double_click(click_btn).perform()
        sleep(2)
        context_btn = self.driver.find_element_by_xpath("//input[@value='right click me']")
        ActionChains(self.driver).context_click(context_btn).perform()
        sleep(3)
        self.driver.quit()
    def test_keys(self):
        self.driver.get('https://www.baidu.com')
        kw = self.driver.find_element_by_id('kw')
        kw.send_keys("selenium")
        sleep(2)
        kw.send_keys(Keys.COMMAND, 'a')
        sleep(2)
        kw.send_keys(Keys.COMMAND, 'x')
        sleep(2)
        kw.send_keys(Keys.COMMAND, 'v')
        sleep(3)
        self.driver.quit()
    def test_move_to(self):
        self.driver.get('https://www.baidu.com')
        login_el = self.driver.find_element_by_link_text('新闻')
        sleep(1)
        ActionChains(self.driver).move_to_element(login_el).click().perform()
        sleep(3)
        self.driver.quit()
if __name__ == '__main__':
    case = TestCase()
    # case.test_mouse()
    # case.test_keys()
    case.test_move_to()
 2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62