心情再不好也要继续更博。。。。路还是要继续走下去,生活还是要继续经历下去
这节学习web自动化测试工具selenium 官方文档 https://selenium-python-zh.readthedocs.io/en/latest/
1.selenium简介
selenium是一个用于测试网站的自动化测试工具,开源,免费;多浏览器支持:Firefox、Chrome、IE、Opera、Safari;多平台支持:Linux 、windows、Mac;多语言支持:Java、Python、ruby、PHP、C#、JavaScript
2.selenium安装
pip install Selenium
3.下载浏览器驱动
如果想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动。
1)各浏览器下载地址:
Firefox浏览器驱动:geckodriver
Chrome浏览器驱动:chromedriver , taobao备用地址
IE浏览器驱动:IEDriverServer
Edge浏览器驱动:MicrosoftWebDriver
Opera浏览器驱动:operadriver
PhantomJS浏览器驱动:phantomjs
2)设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。
我的电脑-->属性-->系统设置-->高级-->环境变量-->系统变量-->Path,将“C:\driver”目录添加到Path的值中。
- Path
- ;C:\driver
3)验证不同的浏览器驱动是否正常使用。
from selenium import webdriver
driver = webdriver.Firefox() # Firefox浏览器
driver = webdriver.Chrome() # Chrome浏览器
driver = webdriver.Ie() # Internet Explorer浏览器
driver = webdriver.Edge() # Edge浏览器
driver = webdriver.Opera() # Opera浏览器
driver = webdriver.PhantomJS() # PhantomJS
4.selenium入门
1)控制浏览器:控制浏览器操作的一些方法
方法 | 说明 |
---|---|
set_window_size() | 设置浏览器的大小 |
back() | 控制浏览器后退 |
forward() | 控制浏览器前进 |
refresh() | 刷新当前页面 |
clear() | 清除文本 |
send_keys (value) | 模拟按键输入 |
click() | 单击元素 |
submit() | 用于提交表单 |
get_attribute(name) | 获取元素属性值 |
is_displayed() | 设置该元素是否用户可见 |
size | 返回元素的尺寸 |
text | 获取元素的文本 |
示例:
###1.控制浏览器
# browser = webdriver.Chrome()#声明浏览器
# url = 'https:www.baidu.com'
# browser.get(url)#打开浏览器预设网址
# browser.maximize_window() #浏览器最大化
# time.sleep(2) #休眠2s等待时间
# browser.set_window_size(480,800) #设置浏览器的高度和宽度
# browser.back() #浏览器后退
# time.sleep(2)
# browser.forward() #浏览器前进
# time.sleep(2)
# browser.refresh()
# browser.close() #关闭浏览器
2)元素定位:Selenium提供了8种定位方式:
- id
- name
- class name
- tag name
- link text
- partial link text
- xpath
- css selector
定位一个元素 | 定位多个元素 | 含义 |
---|---|---|
find_element_by_id | find_elements_by_id | 通过元素id定位 |
find_element_by_name | find_elements_by_name | 通过元素name定位 |
find_element_by_xpath | find_elements_by_xpath | 通过xpath表达式定位 |
find_element_by_link_text | find_elements_by_link_tex | 通过完整超链接定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通过部分链接定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通过标签定位 |
find_element_by_class_name | find_elements_by_class_name | 通过类名进行定位 |
find_elements_by_css_selector | find_elements_by_css_selector | 通过css选择器进行定位 |
示例:
####元素定位操作 BY ID
browser = webdriver.Chrome()#声明浏览器
url = 'https:www.baidu.com'
browser.get(url)#打开浏览器预设网址
browser.maximize_window()
# time.sleep(3) #
element1 = browser.find_element_by_id('kw')
# element1.clear()
element1.send_keys("ccfan")
time.sleep(3)
element1.clear()
element1.send_keys("myzhou4")
# # print (element1)
time.sleep(2)
element2 = browser.find_element_by_id("su")
element2.click()
# print (browser.title)
####元素定位操作 BY name
# browser = webdriver.Chrome()#声明浏览器
# url = 'https:www.baidu.com'
# browser.get(url)#打开浏览器预设网址
# browser.maximize_window()
# time.sleep(3) #
# element1 = browser.find_element_by_name('wd')
# element1.clear()
# element1.send_keys('ccfan')
# time.sleep(10)
#element2 = browser.find_element_by_name('')###无name属性
ps:定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数。
3)鼠标事件:在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供。
方法 | 说明 |
---|---|
ActionChains(driver) | 构造ActionChains对象 |
context_click() | 执行鼠标悬停操作 |
move_to_element(above) | 右击 |
double_click() | 双击 |
drag_and_drop() | 拖动 |
move_to_element(above) | 执行鼠标悬停操作 |
context_click() | 用于模拟鼠标右键操作, 在调用时需要指定元素定位 |
perform() | 执行所有 ActionChains 中存储的行为,可以理解成是对整个操作的提交动作 |
示例:
####鼠标操作
# from selenium.webdriver.common.action_chains import ActionChains
# browser = webdriver.Chrome()
url = "https:www.baidu.com"
# browser.get(url)
# browser.maximize_window()
# time.sleep(2)
# element1 = browser.find_element_by_name("tj_settingicon")
# element1 = browser.find_element_by_id('s-usersetting-top')
# element1.click()
# ActionChains(browser).move_to_element(element1).perform() ###鼠标悬停
# element1 = browser.find_element_by_id('kw')
# element1 = browser.find_element_by_link_text("新闻")
# ActionChains(browser).context_click(element1).perform()
# ActionChains(browser).double_click(element1).perform()
4)键盘事件:Selenium中的Key模块为我们提供了模拟键盘按键的方法,那就是send_keys()方法。它不仅可以模拟键盘输入,也可以模拟键盘的操作。
模拟键盘按键 | 说明 |
---|---|
send_keys(Keys.BACK_SPACE) | 删除键(BackSpace) |
send_keys(Keys.SPACE) | 空格键(Space) |
send_keys(Keys.TAB) | 制表键(Tab) |
send_keys(Keys.ESCAPE) | 回退键(Esc) |
send_keys(Keys.ENTER) | 回车键(Enter) |
组合键的使用
模拟键盘按键 | 说明 |
---|---|
send_keys(Keys.CONTROL,‘a’) | 全选(Ctrl+A) |
send_keys(Keys.CONTROL,‘c’) | 复制(Ctrl+C) |
send_keys(Keys.CONTROL,‘x’) | 剪切(Ctrl+X) |
send_keys(Keys.CONTROL,‘v’) | 粘贴(Ctrl+V) |
send_keys(Keys.F1…Fn) | 键盘 F1…Fn |
5)多窗口切换
在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换。
方法 | 说明 |
---|---|
current_window_handle | 获得当前窗口句柄 |
window_handles | 返回所有窗口的句柄到当前会话 |
switch_to.window() | 用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。 |
示例:
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("http://www.baidu.com")
#1.获得百度搜索窗口句柄
sreach_windows = browser.current_window_handle
browser.find_element_by_link_text('登录').click()
browser.find_element_by_link_text("立即注册").click()
#1.获得当前所有打开的窗口的句柄
all_handles = browser.window_handles
#3.进入注册窗口
for handle in all_handles:
if handle != sreach_windows:
browser.switch_to.window(handle)
print('跳转到注册窗口')
browser.find_element_by_name("account").send_keys('123456789')
browser.find_element_by_name('password').send_keys('123456789')
time.sleep(2)
6)获取断言信息:通过我们获取title 、URL和text等信息进行断言。
属性 | 说明 |
---|---|
title | 用于获得当前页面的标题 |
current_url | 用户获得当前页面的URL |
text | 获取搜索条目的文本信息 |
示例:
from selenium import webdriver
from time import sleep
driver = webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
driver.get("https://www.baidu.com")
print('Before search================')
# 打印当前页面title
title = driver.title
print(title)
# 打印当前页面URL
now_url = driver.current_url
print(now_url)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
print('After search================')
# 再次打印当前页面title
title = driver.title
print(title)
# 打印当前页面URL
now_url = driver.current_url
print(now_url)
# 获取结果数目
user = driver.find_element_by_class_name('nums').text
print(user)
#关闭所有窗口
driver.quit()
7)多表单切换:在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这时就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。
方法 | 说明 |
---|---|
switch_to.frame() | 将当前定位的主体切换为frame/iframe表单的内嵌页面中 |
switch_to.default_content() | 跳回最外层的页面 |
示例:
126邮箱登录框的结构大概是这样子的,想要操作登录框必须要先切换到iframe表单。
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.126.com")
driver.switch_to.frame('x-URS-iframe')
driver.find_element_by_name("email").clear()
driver.find_element_by_name("email").send_keys("username")
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys("password")
driver.find_element_by_id("dologin").click()
driver.switch_to.default_content()
driver.quit()
8)显示等待和隐式等待
- sleep(): 强制等待,设置固定休眠时间。后脚本的执行过程中执行 sleep()后线程休眠,而另外两种线程不休眠。
- implicitly_wait():隐式等待,是设置的全局等待。设置等待时间,是对页面中的所有元素设置加载时间,如果超出了设置时间的则抛出异常。隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。
- WebDriverWait():显示等待,是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException。
还有。。。。。。