第二天
webdriver API
自动化测试的主要步骤
1.通过某些方式找到我们要执行的对象,目标(Target)
2.对这个对象进行什么操作(command)
3.通过操作对定位到的元素赋值(value)
4.添加断言操作
页面元素定位、操作
1.什么是页面元素
在浏览器上能显示的所有要素,如图片,文本框,下拉列表等都是页面元素
2.webdriver提供的元素定位方式
元素的获取方式是通过浏览器的f12进行定位寻找,有时有些元素在html是没有的
webDriver元素定位方式 | 对应的python方法 |
---|---|
id(html中的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() |
(1)通过id元素定位
from selenium import webdriver
import time
# 使用id属性定位
# 创建谷歌浏览器对象
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("hahah")
driver.find_element_by_id("su").click()
time.sleep(2)
driver.quit()
(2)根据name元素定位
from selenium import webdriver
import time
# 使用name属性定位
# 创建谷歌浏览器对象
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_name("wd").send_keys("assss")
driver.find_element_by_id("su").click()
time.sleep(2)
driver.quit()
(3)link text元素定位
from selenium import webdriver
import time
# 使用link text属性定位
# 创建谷歌浏览器对象
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_link_text("新闻").click()
time.sleep(2)
driver.quit()
(4)xpath定位
1.绝对路径定位
/根目录
//:相对节点
父子节点使用/链接
兄弟节点使用[第几个节点]
例如百度:
/html/body/div/div/div[5]/div/div/form/span/input
2.元素属性定位find_element_by_xpath("//input[#id='kw']")
3.层级与属性结合find_element_by_xpath("//form[@id='form'/span/input]")
4.逻辑运算符find_element_by_xpath("//input[#id='kw']" and @class='su')
from selenium import webdriver
import time
# 创建谷歌浏览器对象
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_xpath("/html/body/div/div/div[5]/div/div/form/span/input").send_keys("assss")
driver.find_element_by_id("su").click()
time.sleep(4)
driver.quit()
(5)css定位
css选择器的常见用法
选择器 | 例子 |
---|---|
.class | .intro |
#id | #firstname |
* | * |
element | p |
element>element | div>input |
elemelt+element | div+input |
[attribute=value] | [target=_blank] |
from selenium import webdriver
import time
# 创建谷歌浏览器对象
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
driver.find_element_by_css_selector(".s_ipt").send_keys("dsklj")
driver.find_element_by_css_selector("#su").click()
time.sleep(4)
driver.quit()
3.对元素进行操作
clear(): 清除操作
send_keys(value) 模拟按键操作
click() 单击操作
Current_url 返回当前页面的url地址
title 返回当前页面title
Text 获取页面(提示框,警告框)显示的文本
get_attribute(name) 获得属性值,文本框中的值使用value属性名
is_displayed() 设置该元素是否用户可见
浏览器操作
控制窗口大小
# 控制窗口固定大小
driver.set_window_size(1080,600)
# 控制窗口最小化
driver.minimize_window()
# 控制窗口最大化
driver.maximize_window()
控制浏览器后退前进
driver.back()
driver.forward();
模拟浏览器刷新
driver.refresh()
截屏操作
driver.save_screenshot(r"C:\Users\92588\Desktop\study-测试\笔记\第三章 Python学习\1.png")
模拟浏览器关闭
driver.quit()
driver.close()
练习(多窗口切换)
from selenium import webdriver
import time
'''
打开淘宝
点击天猫
选择女装
返回天猫
'''
'''
句柄(handler):每一个页面都一个值,对一个页面来说是唯一,是页面的一个标识
driver是要绑定的句柄的,你的driver只能控制你绑定句柄的这个页面
获取当前页面的句柄driver.current_window_handle
获取打开所有页面的句柄driver.window_handles
'''
driver = webdriver.Chrome()
driver.get("https://www.taobao.com/")
print(driver.current_window_handle)
driver.find_element_by_link_text("天猫").click()
# 获取打开所有页面的句柄
handles = driver.window_handles
# 将天猫的句柄绑定给driver
driver.switch_to_window(handles[1])
time.sleep(5)
driver.find_element_by_link_text("女装").click()
# 获取打开所有页面的句柄
handles = driver.window_handles
# 将女装的句柄绑定给driver
driver.switch_to_window(handles[2])
time.sleep(5)
driver.back()
time.sleep(5)
# driver绑定的窗口关闭
driver.close()
鼠标、键盘操作
鼠标操作
鼠标事件,click()是模拟鼠标的点击操作
WebDriver中,将鼠标右击,双击,悬停,甚至鼠标拖动等功能封装在ActionChains类中
需要导入包from selenium.webdriver.common.action_chains import ActionChains
常见的方法有
perform()执行所有ActionChains存储的行为
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停
'''
鼠标事件,click()是模拟鼠标的点击操作
WebDriver中,将鼠标右击,双击,悬停,甚至鼠标拖动等功能封装在ActionChains类中
需要导入包from selenium.webdriver.common.action_chains import ActionChains
常见的方法有
perform()执行所有ActionChains存储的行为
context_click() 右击
double_click() 双击
drag_and_drop() 拖动
move_to_element() 鼠标悬停
'''
from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
time.sleep(2)
# # 鼠标悬浮到设置按钮上
# setButton = driver.find_element_by_id("s-usersetting-top")
# # 将设置按钮的操作行为封装到ActionChains,
# ActionChains(driver).move_to_element(setButton).perform()
# 在百度文本框中鼠标右键
kw = driver.find_element_by_id("kw")
ActionChains(driver).context_click(kw).perform()
time.sleep(2)
driver.close()
键盘操作
键盘事件,Keys()提供了键盘上几乎所有的按键方法。send_key()方法可以用来模拟键盘苏联,除此之外,我们还可以用它来输入键盘上的按键,甚至组合键,如Curl+A等
需要导入包from selenium.webdriver.common.keys import Keys
Keys.BACK_SPACE --删除
Keys.CONTROL,"a" --Curl+A
等等
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time
'''
例子
1。百度“wdd”
2。删除多输入的d
3.再输入“东东 是个胆小鬼”
4.ctrl+a 全选文本框内容
5.ctrl+x 截切
6.ctrl+v 粘贴复制的内容
7.回车完成搜索
8.退出让览器
'''
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.maximize_window()
time.sleep(2)
# 1。百度“wdd”
driver.find_element_by_id("kw").send_keys("wdd")
time.sleep(1)
# 2。删除多输入的d
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
time.sleep(1)
# 3.再输入“wd 是个胆小鬼”
driver.find_element_by_id("kw").send_keys(" 是个胆小鬼")
time.sleep(1)
# 4.ctrl+a 全选文本框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"a")
time.sleep(1)
# 5.ctrl+x 截切
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"x")
time.sleep(1)
# 6.ctrl+v 粘贴复制的内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,"v")
time.sleep(1)
# 7.回车完成搜索
driver.find_element_by_id("kw").send_keys(Keys.ENTER)
time.sleep(1)
# 8.退出让览器
driver.close()
警告窗口处理
WebDriver中处理JavaScript所生成的
alert
confirm
prompt
具体做法
switch_to_alert()
返回定位到后,使用
text:返回文字
accept():接受现有的警告窗口
dismiss():放弃现有的警告窗口
send_keys(KeysToSend):发送文本到警告窗口
'''
警告窗口的处理
1.百度
2.设置悬浮
3.悬浮里的搜索设置
4.设置每页显示20条
5.保存设置
6.关闭弹窗
7.关闭浏览器
'''
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
# 1.百度
driver.get("https://www.baidu.com")
driver.maximize_window()
# 2.鼠标悬浮到设置按钮上
setButton = driver.find_element_by_id("s-usersetting-top")
# 将设置按钮的操作行为封装到ActionChains,
ActionChains(driver).move_to_element(setButton).perform()
time.sleep(3)
# 3.悬浮里的搜索设置
driver.find_element_by_link_text("搜索设置").click()
time.sleep(2)
# 4.设置每页显示20条
driver.find_element_by_xpath('//*[@id="se-setting-3"]/span[2]/label').click()
time.sleep(2)
# 5.保存设置,会弹出弹框
driver.find_element_by_xpath('//*[@id="se-setting-7"]/a[2]').click()
time.sleep(2)
# 6.获取弹窗内容,关闭弹窗
# 把弹窗内容获取到赋给dd
dd = driver.switch_to.alert
# 获取弹窗内容
print(dd.text)
# 确认保存关闭
dd.accept()
# 7.关闭浏览器
driver.close()
多窗口、多表单处理
在web应用中会遇到frame/iframe表单嵌套页面的应用,webdriver只能在一个页面上对元素识别与定位,这时就需要switch_to.frame()方法将当前定位的主体切换为frame/iframe表单嵌套页面中
设置元素等待
web使用ajax技术,导致浏览器加载页面时,页面元素可能不能急事加载完成,造成定位元素困难。我们可以通过设置元素等待来完善
隐式等待:创建driver对象的时候,为浏览器对象创建一个等待时间,但是这个时间不是固定的,并不影响脚本执行速度,当脚本执行某个位置时,如果可以定位,则直接执行,不能定位,这等待,只到超时,就抛出异常
driver.implicitly_wait(10) 单位s
显式等待:明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到就一直等,除非在规定的时间之内没有找到,那么就跳出Exception(特别关注莫一个元素才使用)
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By WebDriverWait(driver,timeout=1,poll_frequency=0.5,ignored_exceptions=None)
# timeout --- 超时时间
# poll_frequency -- 频率
# ignored_exceptions --
# until 直到EC.presence_of_element_located的时候
WebDriverWait(driver,timeout=1,poll_frequency=0.5,ignored_exceptions=None).until(EC.presence_of_element_located((By.ID,"su")),'找不到元素')
强制等待
time.sleep(5) 单位s,休眠
优先级:隐式等待 》 强制等待
time.sleep没有影响
脚本练习
qq邮箱基本版登录
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("https://www.qq.com/")
time.sleep(3)
driver.find_element_by_link_text("邮箱").click()
hanles = driver.window_handles
# 把句柄转导邮箱页面
driver.switch_to.window(hanles[1])
time.sleep(3)
driver.find_element_by_link_text("基本版").click()
time.sleep(3)
driver.find_element_by_id("u").send_keys("925880945")
time.sleep(1)
driver.find_element_by_id("p").send_keys("########")
time.sleep(1)
driver.find_element_by_xpath('//*[@id="go"]').click()
time.sleep(3)
print(hanles)
# driver.close()