引入 webdriver API
from selenium import webdriver
在所有的对浏览器操作之前都要先获取浏览器驱动
# 获取 Chrome 浏览器驱动
driver = webdriver.Chrome()
打开浏览器访问百度主页
driver.get("https://www.baidu.com/")
下面两种方法都可以实现关闭浏览器的操作
但 close 方法仅仅关闭当前聚焦的浏览器窗口,quit 方法关闭所有浏览器窗口,并清除浏览器缓存
driver.quit()
driver.close()
元素的定位是自动化测试的核心,要操作一个元素,首先就要先定位到该元素
webdriver 中提供了一系列使用元素不同属性定位元素的方法:
在网页源代码中找到对应的属性值,就可以定位该元素
注:不管用哪种方法,都要保证在当前页面上该属性值是唯一的
定位 id 属性值为 kw 的元素
driver.find_element_by_id("kw")
定位 name 属性值为 wd 的元素
driver.find_element_by_name("wd")
定位标签名为 input 的元素
driver.find_element_by_tag_name("input")
定位 class name 属性值为 s_ipt 的元素
driver.find_element_by_class_name("s_ipt")
在浏览器 控制台中找到要定位的元素,右键 选择 复制 XPath 来获取对应元素的 XPath 属性值
定位 xpath 属性值为 //*[@id=‘kw’] 的元素
driver.find_element_by_xpath("//*[@id='kw']")
css selector 属性值的获取方式同 xpath 属性值的获取方式一样,点击 复制 selector 即可获取
定位 css selector 属性值为 #kw 的元素
driver.find_element_by_css_selector("#kw")
这种方式用来定位带有链接的文字,link text 属性值就是文字内容
driver.find_element_by_link_text("贴吧")
这种方式也是定位带有链接的文字,不过不同于上一种方法的是,这里的属性值可以是页面上具体文字链接内容的一部分
driver.find_element_by_partial_link_text("贴")
前面说了常用的定位元素的方法,定位只是第一步,定位之后需要对元素进行操作以完成测试
webdriver 中常用的操作元素的方法有:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com/")
# 在百度搜索框中输入 python
driver.find_element_by_id("kw").send_keys("python")
# 点击搜索按钮
driver.find_element_by_id("su").click()
# 清空搜索框内容
driver.find_element_by_id("kw").clear
submit 只能在元素属性中 type=“sumit” 时使用,此时使用 submit 实现的效果和 click 点击相同
driver.find_element_by_id("kw").submit()
使用 text 可以获取到已经定位的元素内所有的文本信息
text = driver.find_element_by_class_name("c-container").text
print(text)
等待是一个非常重要的事,由于网络延迟的问题,有时候页面还未加载出来时,但是代码已经执行到下一步,下一步的代码要定位的元素还未被浏览器加载出来,就无法定位导致出错,此时就需要添加等待来等待浏览器将页面加载出来再进行定位
添加等待还可以让我们更直观的看到浏览器执行的每一步
引入 time 包,在指定休眠时间即可
import time
time.sleep(3)
通过 webdriver 下的 implicitly_wait() 方法就可以实现智能等待
智能等待 是指程序会在一个时间范围内等待,当脚本执行到某个元素的定位时,如果可以定位则等待结束,如果不能定位,则会继续等待,直到等待时间超过设置的最大等待时间
driver.implicitly_wait(3) # 最大等待时间 3s
# 打印当前网页 URL
print(driver.current_url)
# 打印当前网页 title,即在 html 源码中 title 标签中的文字信息
print(driver.title)
# 设置浏览器宽 400,高 1000
driver.set_window_size(400, 1000)
driver.maximize_window()
每个浏览器都会有前进和后退按钮,来操作浏览器返回下一个或上一个页面
# 后退,返回上一个页面
driver.back()
# 前进,返回下一个页面
driver.forward()
浏览器滚动条的控制需要依靠 js 脚本
# 把滚动条拉到最底端
js1 = "var q=document.documentElement.scrollTop=10000"
driver.execute_script(js1)
# 把滚动条拉到最顶端
js2 = "var q=document.documentElement.scrollTop=0"
driver.execute_script(js2)
要使用键盘操作,必须引入 Keys 包
键盘操作的按键通过 send_keys 调用,必须要先定位元素再操作
from selenium.webdriver.common.keys import Keys
# TAB 键
driver.find_element_by_id("user_login").send_keys(Keys.TAB)
# ENTER 键
driver.find_element_by_id("user_password").send_keys(Keys.ENTER)
# 空格键
driver.find_element_by_id("user_login").send_keys(Keys.SPACE)
# ESC 键
driver.find_element_by_id("user_login").send_keys(Keys.ESCPACE)
# Ctrl + a,全选
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "a")
# Ctrl + x,剪切
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "x")
# Ctrl + c,复制
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "c")
# Ctrl + v,粘贴
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, "v")
要使用鼠标操作,需要引入 ActionChains 包
同样的,需要先定位元素再进行操作
from selenium.webdriver.common.action_chains import ActionChains
# 鼠标双击
b = driver.find_element_by_id("su")
ActionChains(driver).double_click(b).perform()
# 鼠标右键
a = driver.find_element_by_id("kw")
ActionChains(driver).context_click(a).perform()
# 拖动鼠标到指定位置
a = driver.find_element_by_xpath("//*[@id='s-top-left']/div/a") # 定位移动后的位置
ActionChains(driver).move_to_element(a).perform()
本地 HTML 页面打开时,在浏览器的 URL 显示为 “file:///” + 文件的绝对路径,所以我们需要拼接以下再进行打开
引入 os 包,使用 os.path.abspath(文件绝对路径) 来指定一个绝对路径,再使用字符串拼接的方法将前缀 “file:///” 加上,就得到了我们想要的URL
有如下 HTML 代码,需从中定位所有 checkbox 类型的 input,并全部勾选
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
<title>Checkboxtitle>
head>
<body>
<h3>checkboxh3>
<div class="well">
<form class="form-horizontal">
<div class="control-group">
<label class="control-label" for="c1">checkbox1label>
<div class="controls">
<input type="checkbox" id="c1" />
div>
div>
<div class="control-group">
<label class="control-label" for="c2">checkbox2label>
<div class="controls">
<input type="checkbox" id="c2" />
div>
div>
<div class="control-group">
<label class="control-label" for="c3">checkbox3label>
<div class="controls">
<input type="checkbox" id="c3" />
div>
div>
<div class="control-group">
<label class="control-label" for="r">radiolabel>
<div class="controls">
<input type="radio" id="r1" />
div>
div>
<div class="control-group">
<label class="control-label" for="r">radiolabel>
<div class="controls">
<input type="radio" id="r2" />
div>
div>
form>
div>
body>
html>
自动化脚本如下:
import os
import time
from selenium import webdriver
# 获取浏览器驱动
driver = webdriver.Chrome()
# 拼接 URL
url = "file:///" + os.path.abspath("D:\\JAVA\\Python\\project\\selenium\\test2.html")
# 打开 HTML 页面
driver.get(url)
# 定位所有的 input 标签,得到的结果是一个 list
elements = driver.find_elements_by_tag_name("input")
for element in elements:
# 在 list 中筛选 checkbox 并勾选
# get_attribute 得到元素的某一个属性值
if element.get_attribute("type") == "checkbox":
element.click()
time.sleep(1)
time.sleep(3)
driver.quit()
在 HTML 页面的设计中,常常会有框架的嵌套,或者在操作浏览器时常常会出现多个窗口,此时若可以定位到某个具体的框架或者窗口,再去定位元素就会简单许多
webdriver 中提供了下面两种方法来对框架进行定位
# 定位到当前页面内嵌套的某个框架
driver.switch_to.frame(frameName)
# 从嵌套中跳出,跳回最外面的默认页面
driver.switch_to.default_content()
注意:
在框架之间进行跳转时,只能从当前页面跳转到当前页面内嵌套的页面
如上图的框架嵌套:
default 可以跳转到 f1,不能到 f2
f1 可以到 f2,f2 不能到 f1
webdriver 中针对窗口的方法是:switch_to.window
用法以 switch_to.frame 相同
webdriver 中提供了如下方法对 alert 弹框进行定位:
定位到弹框之后再使用如下方法对 alert 弹框进行处理: