最近学习了测试课程部分的自动化测试,第一次发现这玩意挺有趣的,用 python 语言编写自动化脚本,竟然可以直接来操作浏览器,彻底解放双手。这篇文章只是简单的总结了操作 API 一些常用操作,还请大佬们勿喷!!!
selenium工具:自动化测试工具,UI测试工具。特点是轻量免费,支持多语言多平台,支持分布式
webdriver:是 selenium2 提供的一种用于操作浏览器的 api 接口,要操作那个浏览器,就要把那个浏览器的版本驱动放到 python 的安装路径的 Scripts里
# coding = utf-8
from selenium import webdriver
import time
driver = webdriver.Firefox()
time.sleep(3)
driver.get("http://www.baidu.com")
time.sleep(3)
driver.find_element_by_id("kw").send_keys("周杰伦")
time.sleep(3)
driver.find_element_by_id("su").click()
driver.quit()
解析
使用百度的搜索框包含的属性信息为例
id 和 name 是我们最最常用的定位方式,因为大多数控件都有这两个属性,而且在对控件的id 和name 命名时一般使其有意义也会取不同的名字。通过这两个属性使我们找一个页面上的属性变得相当容易。
通过 find_element_by_id("kw")
函数就是捕获到百度输入框
通过 find_element_by_name("wd")
函数同样也可以捕获百度输入框
class name 类名定位,如果类名不是唯一,或者修饰这个属性的使用了多个类名,也定位不到,不建议使用。tag name 为定位标签名的定位,比如input,h1,h2,a 等等。
find_element_by_class_name("s_ipt")
函数捕获百度输入框。find_element_by_tag_name("s_ipt")
定位链接,有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过 link
find_element_by_link_text("视频")
import time
from selenium import webdriver
drive = webdriver.Chrome()
drive.get("https://www.baidu.com/")
title = drive.title
drive.find_element_by_partial_link_text("视频").click()
time.sleep(8)
drive.quit()
XPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可是使用这种强大语言在web 应用中定位元素。XPATH的获取可以用chrome的F12开发者模式中Element-右键-copy-copy xpath来获取。
find_element_by_xpath("")
import time
from selenium import webdriver
drive = webdriver.Chrome()
drive.get("https://www.baidu.com/")
# 定位搜索框输入对应的key
drive.find_element_by_xpath("//*[@id='kw']").send_keys("马龙")
# 定位"百度一下"这个框,并获取点击事件
drive.find_element_by_xpath("//*[@id='su']").click()
# 等待8秒
time.sleep(8)
drive.quit()
CSS是一种语言,它被用来描述HTML 和XML 文档的表现。CSS 使用选择器来为页面元素绑定属性。这些选择器可以被selenium 用作另外的定位策略。CSS 的比较灵活可以选择控件的任意属性。
find_element_by_css_selector("#kw")
,通过find_element_by_css_selector( )函数,选择取百度输入框的 id 属性来定义,CSS的获取可以用chrome的F12开发者模式中Element-右键-copy-copy selector来获取。import time
from selenium import webdriver
drive = webdriver.Chrome()
drive.get("https://www.baidu.com/")
drive.find_element_by_css_selector("#kw").send_keys("马龙")
drive.find_element_by_css_selector("#su").click()
time.sleep(8)
drive.quit()
click
点击对象send_keys
在对象上模拟按键输入clear
清除对象的内容,如果可以的话submit
提交表单,text
用于获取元素的文本信息time.sleep()
:固定等待
驱动变量.implicitly_wait()
:智能等待,implicitly_wait()的用法应该比time.sleep() 更智
能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
打印 tile 及 url
驱动变量.title
驱动变量.current_url
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print driver.title # 把页面title 打印出来
print driver.current_url #打印url
driver.quit()
maximize_window()
:浏览器最大化set_window_size(480, 800)
:浏览器具体宽高back()
:浏览器返回(后退)forward()
:浏览器前进import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 浏览器最大化
driver.maximize_window()
driver.find_element_by_id("kw").send_keys("张家齐")
driver.find_element_by_id("su").click()
# 浏览器长400px,宽1000px
time.sleep(3)
driver.set_window_size(400,1000)
time.sleep(3)
# js 实现浏览器滚动条到浏览器底端
js1 = "var q = document.documentElement.scrollTop=1000"
driver.execute_script(js1)
time.sleep(5)
# js 实现浏览器滚动条到浏览器顶端
js2 = "var q = document.documentElement.scrollTop=0"
driver.execute_script(js2)
time.sleep(5)
driver.quit()
要想调用键盘按键操作需要引入 keys 包:
from selenium.webdriver.common.keys import Keys
通过send_keys()
调用按键,例如:
send_keys(Keys.TAB)
:调用 TAB 键
send_keys(Keys.ENTER)
: 调用 回车 键
要想调用鼠标操作需要引入 ActionChains 包:
from selenium.webdriver.common.action_chains import ActionChains
例如表示鼠标右键用法:ActionChains(驱动事件).context_click(定位到的元素).perform()
context_click()
右击double_click()
双击drag_and_drop()
拖动move_to_element()
移动from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get("http://news.baidu.com")
qqq =driver.find_element_by_xpath(".//*[@id='s_btn_wr']")
ActionChains(driver).context_click(qqq).perform() #右键
ActionChains(driver).double_click(qqq).perform() #双击
#定位元素的原位置
element = driver.find_element_by_id("s_btn_wr")
#定位元素要移动到的目标位置
target = driver.find_element_by_class_name("btn")
#执行元素的移动操作
ActionChains(driver).drag_and_drop(element, target).perform()
webdriver 可以很方便的使用 findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用 findElements 方法。
用 python 语法,就是通过选取所有的 input 控件,根据它类型的不同,选出我们想要选择的类型然后获取点击事件
from selenium import webdriver
import time
import os
dr = webdriver.Chrome()
file_path = 'file:///' + os.path.abspath('checkbox.html')
dr.get(file_path)
# 选择页面上所有的input,然后从中过滤出所有的checkbox 并勾选之
inputs = dr.find_elements_by_tag_name('input')
for input in inputs:
if input.get_attribute('type') == 'checkbox':
input.click()
time.sleep(2)
dr.quit()
注意:get_attribute:
获得属性值。
多层框架或窗口的定位:
switch_to_frame()
switch_to_window()
对于一个现代的web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一个难题。
有时候我们定位一个元素,定位器没有问题,但一直定位不了,这时候就要检查这个元素是否在一个frame 中,seelnium webdriver 提供了一个switch_to_frame
方法,可以很轻松的来解决这个问题。
switch_to_frame(
name
orid
orframe_element
):
如果这个frame有name和id属性那么就用这两个属性就好,如果没有的话可以先用find_element_by_xxx方法找到这个frame元素,然后把这个元素传进去,这也是可行的。
下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项。
如图所示,要选中下拉列表的第三个选项
代码如下:
from selenium import webdriver
import time
import os
driver = webdriver.Chrome()
# 拼 url
url = "file:///" + os.path.abspath("E:\\编程学习\\代码\\python\\Day1\\selenium2html\\drop_down.html")
driver.get(url)
driver.maximize_window()
time.sleep(3)
# 1.通过 tag name
options = driver.find_elements_by_tag_name("option")
for option in options:
if option.get_attribute('value') == "10.69":
option.click()
time.sleep(6)
# 2.通过 css selector
driver.find_element_by_css_selector("#ShippingMethod > option:nth-child(3)").click()
# 数组的方式去定位,操作
options[2].click()
time.sleep(6)
driver.quit()
未完待续…