Python3-Selenium开启自动化测试
一、Selenium简介
Selenium是一款适用于Web应用程序的便携式软件测试框架。 Selenium为编写测试提供了一个回放工具,无需学习测试脚本语言。它还提供了一种测试领域特定的语言,用于编写包括C#,Groovy,Java,Perl,PHP,Python,Ruby和Scala等多种流行编程语言的测试。
环境配置:
系统:windows10 浏览器:Chrome 70.0.3538.110 Python: 3.7.0 Selenium: 3.141.0
二、Selenium的安装与测试
2.1 Selenium安装
使用Python可直接利用pip进行安装selenium > pip install selenium
2.2 浏览器驱动driver安装
2.2.1 浏览器驱动driver的下载
- 下载地址:Google Chrome driver
注意:driver的下载需要注意对应浏览器的版本
2.2.2 浏览器驱动driver的安装
下载下来的zip文件解压至python安装目录中,可以放在:
C:
中,但是推荐放置在scripts目录中:C:
完成以上工作,我们就可以进行测试使用selenium驱动浏览器了。
2.3 测试驱动浏览器
1 | from selenium import webdriver |
看起来正常驱动浏览器并打开了网页,这样我们就完成了selenium自动化测试的准备工作~!
完成环境的安装并测试之后,我们对Selenium有了一定的了解,接下来我们继续驱动浏览器做一些基本操作。
****** ### 三、窗口尺寸设置、网页截图、刷新、前进和后退 #### 3.1
窗口尺寸设置
在测试过程中,我们可能会要求打开浏览器的窗口处于最大化或者设置为某一特定尺寸的大小,所以我们使用selenium驱动浏览器时设定窗口大小.
1
2
3
4
5
6
7
8
9
10
11
12from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
size = driver.get_window_size() # 获取窗口尺寸
driver.set_window_size(800,600) # 设置窗口尺寸
driver.minimize_window() # 最小化窗口
driver.maximize_window() # 最大化窗口1
driver.get_screenshot_as_file(u'D:\\xxx.png') # 前缀u解决编码问题
3.3 刷新、前进和后退
1 | from selenium import webdriver |
四、定位元素
selenium提供了多种方式进行定位元素:find_element_by_*
1
2
3
4
5
6
7
8find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selectorfind_elements_by_*
1
2
3
4
5
6
7find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selectorfind_element_by_xpath
等一系列定位元素的方法获取到网页元素(文本框、按钮等)后,我们可以通过一些函数来对元素进行操作。
#### 5.1 输入和点击 1
2
3
4
5driver.find_element_by_xpath('').clear() # 清空文本框内容
driver.find_element_by_xpath('').send_keys() # 向文本框中输入内容
driver.find_element_by_xpath('').click() # 鼠标单击操作
driver.find_element_by_xpath('').submit() # 对信息进行提交,相当于回车
# submit()要求提交对象是一个表单,click()更强调事件的独立性
5.2 获取元素属性
通过定位元素位置后,就可以获得元素的诸多属性信息,当然是源代码中元素属性存在的情况下。
1 | from selenium import webdriver |
在上述代码中,依次通过 .get_attribute(‘href’)
、
element.text
、element.tag_name
、
element.size
获得了属性值href、元素文本内容、元素标签名、元素尺寸这些常用的方法。
****** ### 六、键盘和鼠标模拟 #### 6.1 键盘事件 1
2
3
4
5from selenium import webdriver
from selenium.webdriver.common.keys import Keys
# 示例
driver.find_element_by_xpath('xxx').send_keys(Keys.BACK_SPACE) # 利用backspace键删除字符串最后一位
1 | send_keys(Keys.BACK_SPACE) 删除键(BackSpace) |
6.2 鼠标事件
ActionChains是一种自动执行低级别交互的方法,例如鼠标移动,鼠标按钮操作,按键和上下文菜单交互。这对于执行更复杂的操作非常有用,例如悬停和拖放。 + 在ActionChains对象上调用操作方法时,操作将存储在ActionChains对象的队列中。 + 当调用perform()时,事件将按它们排队的顺序触发。
ActionChains可以用于链式或者可以将操作逐个排队,然后执行。
无论哪种方式,动作都按照它们被调用的顺序执行,一个在另一个之后执行。
这里还是以代码展示部分功能吧: ###### 方法一:可以写一长串
1
2
3
4
5from selenium.webdriver.common.action_chains import ActionChains
menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
ActionChains(driver).move_to_element(menu).click(hidden_submenu).perform()1
2
3
4
5
6menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")
actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()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
29click(on_element=None) ——单击鼠标左键
click_and_hold(on_element=None) ——点击鼠标左键,不松开
context_click(on_element=None) ——点击鼠标右键
double_click(on_element=None) ——双击鼠标左键
drag_and_drop(source, target) ——拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) ——拖拽到某个坐标然后松开
key_down(value, element=None) ——按下某个键盘上的键
key_up(value, element=None) ——松开某个键
move_by_offset(xoffset, yoffset) ——鼠标从当前位置移动到某个坐标
move_to_element(to_element) ——鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset) ——移动到距某个元素(左上角坐标)多少距离的位置
perform() ——执行链中的所有动作
release(on_element=None) ——在某个元素位置松开鼠标左键
send_keys(*keys_to_send) ——发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) ——发送某个键到指定元素1
2from selenium import webdriver
from selenium.webdriver.support.select import Select1
2
31 select_by_index # 通过索引定位
2 select_by_value # 通过value值定位
3 select_by_visible_text # 通过文本值定位
7.1.3 Select提供了三种返回options信息的方法
1 | 1 options # 返回select元素所有的options |
注意事项:
这三种方法的作用是查看已选中的元素是否是自己希望选择的:
options:提供所有选项的元素列表;
all_selected_options:提供所有被选中选项的元素列表;
first_selected_option:提供第一个被选中的选项元素;
7.1.4 Select提供了四种取消选中项的方法
1 | 1 deselect_all # 取消全部的已选择项 |
注意事项:
在日常的web测试中,会经常遇到某些下拉框选项已经被默认选中,这种时候就需要用到这里所说的四种方法
7.1.5 代码示例
1 | from selenium import webdriver |
7.2 弹窗
在完成某些操作时会弹出对话框来提示,主要分为”警告消息框”,“确认消息框”,“提示消息对话”三种类型的对话框。
1.警告消息框(alert) 警告消息框提供了一个”确定”按钮让用户关闭该消息框,并且该消息框是模式对话框,也就是说用户必须先关闭该消息框然后才能继续进行操作。
2.确认消息框(confirm) 确认消息框向用户提示一个”是与否”问题,用户可以根据选择”确定”按钮和”取消”按钮。
3.提示消息对话(prompt) 提示消息框提供了一个文本字段,用户可以在此字段输入一个答案来响应您的提示。该消息框有一个”确定”按钮和一个”取消”按钮。选择”确认”会响应对应的提示信息,选择”取消”会关闭对话框。
selenium 提供switch_to.alert()方法定位到 alert/confirm/prompt对话框。使用 text/accept/dismiss/send_keys 进行操作,这里注意的是send_keys只能对prompt进行操作。
1 | switch_to.alert() #定位弹出对话 |
八、等待方式
在webdriver只有两种类型等待方式,显式等待和隐式等待,之前是在程序运行过程中使用time模块中的sleep进行代码的休眠进行强制等待,是显式等待中的一种极端情况。
#### 8.1 显式等待
显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23from time import ctime
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
try:
print(ctime())
element = WebDriverWait(dr, 10).until(
EC.presence_of_element_located((By.ID, "kw"))
)
# WebDriverWait(driver=self.driver, timeout=300, poll_frequency=0.5, ignored_exceptions=None)
# driver:浏览器驱动
# timeout:最长超时等待时间
# poll_frequency:检测的时间间隔,默认为500ms
# ignore_exception:超时后抛出的异常信息,默认情况下抛出 NoSuchElementException 异常
print("我已找到")
finally:
print(ctime())
driver.quit()
通过WebDriverWait 和 ExpectedCondition 组合使用,让我们的代码执行只需要等待需要的时长,而不是固定的时长,这样最大限度的节省时间。
此外ExpectedCondition类中提供了很多预期条件判断方法,省去了再创建包的功夫:
1 | title_is:判断当前页面的title是否等于预期 |
8.2 隐式等待
隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
1
driver.implicity_wait(10)
1
2driver.switch_to.frame('') # 选择iframe
driver.switch_to.default_content() # 回到主页面