教程传送门 -> Selenium Python http://www.testclass.net/selenium_python/
=========================================================
先创建一个文件试一试~ 创建baidutest.py,内容如下
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
print(driver.title)
driver.quit()
执行会以Chrome打开baidu网页,然后关闭。
C:\rf>python baidutest.py
DevTools listening on ws://127.0.0.1:54504/devtools/browser/0b3089e0-2561-48c2-b76b-652e8c684aef
百度一下,你就知道
C:\rf>
关于设置不同浏览器驱动,参考 http://www.testclass.net/selenium_python/selenium3-browser-driver
selenium元素定位
Selenium提供8种定位方式 | Python selenium中所对应的方法 |
id | find_element_by_id() |
name | find_element_by_name() |
class name | find_element_by_class_name() |
tag name | find_element_by_tag_name() |
link text | find_element_by_link_text() |
partial link text | find_element_by_partial_link_text() |
xpath | find_element_by_xpath() |
css selector | find_element_by_css_selector() |
xpath语法 https://www.w3school.com.cn/xpath/xpath_syntax.asp
css选择器 https://www.w3school.com.cn/cssref/css_selectors.asp
[例] 定位百度的搜索输入框
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw")
控制浏览器操作
@控制浏览器窗口大小
使用set_window_size()方法来设置浏览器的大小
driver.set_window_size(480, 800)
使用maximize_window()方法使打开的浏览器全屏显示
driver.maximize_window()
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
#使用set_window_size()方法来设置浏览器的大小
driver.set_window_size(480, 800)
#使用maximize_window()方法使打开的浏览器全屏显示
#driver.maximize_window()
#driver.quit()
@控制浏览器后退、前进
返回上一个网址
driver.back()
前进到之前的网址
driver.forward()
@刷新页面
driver.refresh()
WebDriver常用方法
@点击和输入
定位元素之后需要对这个元素进行操作,例如在输入框中输入内容、清空输入框、点击按钮
清除文本
clear()
模拟按键输入
send_keys(value)
单击元素
click()
[例] 百度搜索输入框输入python,然后清除,输入selenium,点击搜索
注:搜索框标签的id是“kw”,“百度一下”按钮标签的id是"su"
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("python")
sleep(5)
driver.find_element_by_id("kw").clear()
sleep(2)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(5)
driver.quit()
@提交
提交表单
submit()
[例] 在搜索框输入关键字之后执行“回车”
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("kw").submit()
sleep(5)
driver.quit()
说明:submit() 也可以提交一个按钮, submit()的应用范围不及 click()广泛。
@其他常用方法
size: 返回元素的尺寸。
text: 获取元素的文本。
get_attribute(name): 获得属性值。
is_displayed(): 设置该元素是否用户可见。
鼠标事件
WebDriver中,关于鼠标操作的方法封装在ActionChains类提供。
执行所有 ActionChains 中存储的行为
perform()
右击
context_click()
双击
double_click()
拖动
drag_and_drop()
鼠标悬停
move_to_element()
[例] 鼠标悬停操作
from selenium import webdriver
# 引入提供鼠标操作的 ActionChains 类
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://www.baidu.cn")
# 定位到要悬停的元素(右上角的“设置”)
above = driver.find_element_by_link_text("设置")
# 对定位到的元素执行鼠标悬停操作
#ActionChains(driver)->调用 ActionChains()类, 将浏览器驱动 driver 作为参数传入。
ActionChains(driver).move_to_element(above).perform()
这个例子最终没有关闭浏览器,用例执行效果如下(鼠标悬停在“设置”)
键盘事件
Keys()类提供了键盘上几乎所有按键的方法,在使用键盘按键方法前需要先导入 keys 类
from selenium.webdriver.common.keys import Keys
常用的键盘操作:
send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
send_keys(Keys.SPACE) 空格键(Space)
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) 键盘 F1
……
send_keys(Keys.F12) 键盘 F12
[例] 模拟上述一系列操作
from selenium import webdriver
from time import sleep
# 引入 Keys 模块
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 输入框输入内容
driver.find_element_by_id("kw").send_keys("seleniumm")
sleep(2)
# 删除多输入的一个 m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
sleep(2)
# 输入空格键+“教程”
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
sleep(2)
driver.find_element_by_id("kw").send_keys("教程")
sleep(2)
# ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')
sleep(2)
# ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')
sleep(2)
# ctrl+v 粘贴内容到输入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'v')
sleep(2)
# 通过回车键来代替单击操作
driver.find_element_by_id("su").send_keys(Keys.ENTER)
sleep(2)
driver.quit()
获取断言信息
断言即判断结果与预期是否相符。
GUI测试可以通过获取title 、URL和text等信息进行断言。
[例] 获取页面标题、URL和特定文本信息
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
# 打印当前页面title
title = driver.title
print('Title before search:' + title)
# 打印当前页面URL
now_url = driver.current_url
print('URL before search:' + now_url)
driver.find_element_by_id("kw").send_keys("selenium")
driver.find_element_by_id("su").click()
sleep(1)
# 再次打印当前页面title
title = driver.title
print('Title after search:' + title)
# 获取结果数目
record_num = driver.find_element_by_class_name('nums_text').text
print('Record number:'+ record_num)
driver.quit()
其中获取结果数目的标签class属性值为“nums_text”
脚本运行结果如下:
C:\rf>python test.py
DevTools listening on ws://127.0.0.1:50646/devtools/browser/9cf54638-696b-4b6f-a0af-75bc89a65db9
Title before search:百度一下,你就知道
URL before search:https://www.baidu.com/
Title after search:selenium_百度搜索
Record number:百度为您找到相关结果约39,200,000个
C:\rf>
多窗口切换
在页面操作过程中有时候点击某个链接会弹出新的窗口,这时就需要主机切换到新打开的窗口上进行操作。
current_window_handle:获得当前窗口句柄。
window_handles:返回所有窗口的句柄到当前会话。
switch_to.window():用于窗口之间切换。
例子参考 http://www.testclass.net/selenium_python/more-windows
警告框处理
在WebDriver中处理JS所生成的alert/confirm/prompt ->使用switch_to.alert方法定位到 alert等,然后使用如下方法进行操作
text:获取弹框文本
accept(): 确认
dismiss():取消
send_keys(keysToSend):用于prompt弹框输入keysToSend,alert/confirm会报错
注意:旧版selenium切换到弹框使用switch_to_alert,新版的selenium用switch_to.alert
[例] 打开百度网页,选择设置 -> 搜索设置,点击“保存设置”,
在弹出的警告框点击“确认”
实现代码如下:
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
# 鼠标悬停至“设置”链接
link = driver.find_element_by_link_text('设置')
ActionChains(driver).move_to_element(link).perform()
# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
# 保存设置
#driver.find_element_by_class_name("prefpanelgo").click()
savebtn = driver.find_element_by_class_name("prefpanelgo")
driver.execute_script("arguments[0].click();", savebtn)
time.sleep(2)
# 获取警告框文本
message = driver.switch_to.alert.text
print(message)
time.sleep(2)
# 接受警告框
driver.switch_to.alert.accept()
driver.quit()
浏览器操作符合预期,后台打印(代码25行)如下:
C:\rf>python test.py
DevTools listening on ws://127.0.0.1:50495/devtools/browser/9cf543d8-a75d-419b-a2cd-e1008fbb6a4e
已经记录下您的使用偏好
C:\rf>
说明:注意代码第17-19行,如果使用17行,注释18、19行,报错元素不可点击,如下
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: Element <a href="#" class="prefpanelgo">...</a> is not clickable at point (579, 240). Other element would receive the click: <td id="se-setting-5">...</td>
换成18、19行可以解决,参考 https://blog.csdn.net/WanYu_Lss/article/details/84137519
下拉框选择
Select类用于定位select标签,使用前需要导入模块 -> from selenium.webdriver.support.select import Select
select_by_value() 方法用于定位下接选项中的value值
[例] 百度搜索设置的下拉框
from selenium import webdriver
from selenium.webdriver.support.select import Select
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')
# 鼠标悬停至“设置”链接
driver.find_element_by_link_text('设置').click()
sleep(1)
# 打开搜索设置
driver.find_element_by_link_text("搜索设置").click()
sleep(2)
# 搜索结果显示条数
sel = driver.find_element_by_xpath("//select[@id='nr']")
Select(sel).select_by_value('50') # 显示50条
sleep(2)
driver.quit()
cookie操作
WebDriver操作cookie的方法:
获得所有cookie信息
get_cookies()
返回字典的键为name的cookie信息
get_cookie(name)
添加cookie,内容是字典
add_cookie(cookie_dict)
删除所有cookie信息
delete_all_cookies()
删除指定cookie信息,name是要删除的cookie的名称,optionsString是该cookie的选项
delete_cookie(name,optionsString)
例子参考 http://www.testclass.net/selenium_python/cookie
窗口截图
driver.get_screenshot_as_file("指定截图图片的保存位置和名称")
例子参考 http://www.testclass.net/selenium_python/get-screenshot
关闭浏览器
关闭单个窗口
close()
关闭所有窗口
quit()