webdriver常用API的使用总结

要使用selenium的webdriver里的函数,首先把包导进来:from selenium import webdriver
导入使用浏览器的驱动这里我用的是Chrome:driver = webdriver.Chrome()

元素的定位

对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象

一个对象就是一个人一样,有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、门牌找到这个人
一个对象也有类似的属性,我们可以通过这个属性找到这对象

注意:不管用哪种方式,必须保证页面上该属性的唯一性
webdriver 提供了一系列的对象定位方法,常用的有以下几种:

  • id
  • name
  • class name
  • link text
  • partial link text
  • tag name
  • xpath
  • css selector

这里以百度为例:
在输入框输入数据后点击百度一下按钮,这里需要定位两个元素:输入框、百度一下按钮

<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">

通过id定位:
driver.find_element_by_id(“kw”).send_keys(“iu”)
通过name定位:
driver.find_element_by_name(“wd”).send_keys(“selenium”)
通过class name定位:
driver.find_element_by_class_name(“s_ipt”).send_keys(“iu”)
通过CSS定位:
driver.find_element_by_css_selector("#kw").send_keys(“iu”)
通过xpath定位:
driver.find_element_by_xpath("//*[@id=‘kw’]").send_keys(“iu”)

CSS 定位
CSS是一种语言,它被用来描述HTML 和XML 文档的表现
CSS使用选择器来为页面元素绑定属性。这些选择器可以被selenium 用作另外的定位策略
CSS 的比较灵活,可以选择控件的任意属性,

find_element_by_css_selector("#kw")
通过find_element_by_css_selector( )函数,选择取百度输入框的id 属性来定义

XPath定位
XPath 是一种在XML 文档中定位元素的语言。因为HTML 可以看做XML 的一种实现,所以selenium 用户可使用这种强大语言在web应用中定位元素
网页中定位复制xpath
XPath 扩展了上面id 和name 定位方式,提供了很多种可能性

# xpath写法://*[@id="kw"]
#      //*[@name="wd"]---*:省略路径后通过name/id定位
driver.find_element_by_xpath("//*[@id='kw']").send_keys("喻言")
driver.find_element_by_xpath("//*[@id='su']").click()
id 和name 定位

id 和name 是最常用的定位方式,因为大多数控件都有这两个属性,而且在对控件的id和name命名时一般也会取不同的名字。通过这两个属性使我们找一个页面上的属性变得相当容易

以id定位为例:

from selenium  import webdriver
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.find_element_by_id("kw").send_keys("iu")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.close()
#close方法关闭当前的浏览器窗口
#quit方法不仅关闭窗口,还会彻底的退出webdriver,释放与driver server之间的连接
#简单来说quit是更加彻底的close,quit会更好的释放资源

link text定位
有时候不是一个输入框也不是一个按钮,而是一个文字链接,我们可以通过link

如点击上面的文字信息:driver.find_element_by_link_text("hao123").click()

Partial link text 定位
通过部分链接定位,这个有时候也会用到,拿上面的例子,我可以只用链接的一部分文字进行匹配:driver.find_element_by_partial_link_text("hao").click()

操作测试对象

定位元素只是第一步,定位之后需要对这个原素进行操作。鼠标点击呢还是键盘输入,这要取决于我们定位的是按钮还输入框
一般来说,webdriver中比较常用的操作对象的方法有下面几个:

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • clear 清除对象的内容,如果可以的话
  • submit 清除对象的内容,如果可以的话
  • text 用于获取元素的文本信息

submit 提交表单
把点击“百度一下”的操作从click 换成submit 可以达到相同的效果:driver.find_element_by_id("su").submit()

text 获取元素文本
输出页面中所指文本

data=driver.find_element_by_id("s-bottom-layer-right").text
print(data)
driver.close()

添加等待

添加休眠非常简单,我们需要引入time 包,就可以在脚本中自由的添加休眠时间了

智能等待

driver.find_element_by_id("kw").send_keys("iu")
driver.find_element_by_id("su").click()
time.sleep(6)
#driver.implicitly_wait(6)
driver.find_element_by_link_text("IU_百度百科").click()
time.sleep(3)

使用time包时页面固定6秒钟
而智能等待在下面的百度百科可以定位后就停止等待

打印页面信息
print(driver.title) # 把页面title 打印出来
print(driver.current_url) #打印url

操作浏览器
浏览器最大化

调用启动的浏览器不是全屏的,可以在进入页面后最大化:

driver=webdriver.Chrome()
driver.get("https://www.baidu.com/")
driver.maximize_window()
设置浏览器宽、高

也可以根据喜好调整浏览器页面大小browser.set_window_size(480, 800)

操作浏览器的前进、后退

浏览器上有一个后退、前进按钮,对于浏览网页的人是比较方便的

 # 浏览器后退
driver.back()
time.sleep(3)
# 浏览器前进
driver.forward()
控制浏览器滚动条
#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)

#将滚动条移动到页面的顶部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)

execute_script(script, *args),在当前窗口/框架同步执行javaScript

键盘事件
键盘按键用法

需要引入keys 包

from selenium.webdriver.common.keys import Keys 

#定位密码框输入密码后按entet键登陆
driver.find_element_by_name("password").send_keys(Keys.ENTER)
#也可定位登陆按钮,通过enter(回车)代替click()
driver.find_element_by_id("login").send_keys(Keys.ENTER)

通过send_keys()调用按键:
send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回车

键盘组合键用法
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
#输入框输入内容
driver.find_element_by_id("kw").send_keys("selenium")
time.sleep(3)
#ctrl+a 全选输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
time.sleep(3)
#ctrl+x 剪切输入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x')
time.sleep(3)
#输入框重新输入内容,搜索
driver.find_element_by_id("kw").send_keys("webdriver")
driver.find_element_by_id("su").click()
time.sleep(3)
driver.quit()
鼠标事件

ActionChains 类

  • context_click() 右击
  • double_click() 双击
  • drag_and_drop() 拖动
  • move_to_element() 移动

执行的命令:
 1. 重置 reset_actions
 2. 执行操作 perform()

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 方法
定位一组对象一般用于以下场景:
批量操作对象,比如将页面上所有的checkbox都勾上
先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象

定位checkbox这三个同一组元素,type一样,下面两个圆框属于一种属性,可以根据type定位一组

#get_attribute:获得属性值
inputs=driver.find_element_by_tag_name("input")
for input in inputs:
    if input.get_attribute('type')=="checkbox":
        input.click()
        
多层框架/窗口定位

switch_to.frame()
switch_to.window()

此时即使id在f2这层中是唯一的,也不能直接用id进行定位

就像是在商场找一点点,店铺在三楼,在一楼是找不到的,需要一层一层走到三楼后在三楼寻找

driver.switch_to.frame("f1")
driver.switch_to.frame("f2")

#让页面再次回到默认页面,再在默认页面找f1
driver.switch_to.default_content()#回默认页面
driver.switch_to.frame("f1")
层级定位


点击第一层一元素后出现第二层

定位思路
先点击显示出下拉菜单,然后再定位到该下拉菜单所在的ul,再定位这个ul下的某个具体的link

driver.find_element_by_link_text("Link1").click()
driver.implicitly_wait(6)
list=driver.find_element_by_id("dropdown1").find_element_by_link_text("Action")
ActionChains(driver).move_to_element(list).perform()
下拉框处理

下拉框是最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框,再定位到下拉框内里的选项


首先定位到select,然后再定位option【可用xpath进行定位】

#法一:xpath定位
ship = dirver.find_element_by_id("ShippingMethod")
ship.find_element_by_xpath("//*[@value='10.69']").click()

#法二:属性定位
lists = driver.find_element_by_tag_name("option")
for list in lists:
	if list.get_attribute('value')=="10.69":#取value属性的值
		list.click()
#法三:数组下标定位
lists = driver.find_element_by_tag_name("option")
lists[2].click()

三种等待

time.sleep(10)
#老老实实等待十秒钟

driver.implicitly_wait(10)
#十秒内前面的操作就开始下一个操作

WebDriverWait(driver,10).until(lambda driver:driver.find_element_by_id("su"))
#每隔500毫秒判断元素是否出现,出现了就停止等待
alert、confirm、prompt的处理

text返回alert/confirm/prompt 中的文字信息
accept 点击确认按钮
dismiss 点击取消按钮,如果有的话
send_keys 输入值,这个alert\confirm 没有对话框就不能用了,不然会报错
switch_to_alert()获得操作这个框的句柄,只能处理原生的alert

如图,不能弹出这个框就停止自动化

alert=driver.switch_to.alert
#打印框里的内容
print("alert:"+alert.text)
alert.accept()

对于需要输入的alert框

alert=driver.switch_to.alert
#打印框里的内容
alert.send_keys("ok")
alert.accept()
DIV对话框的处理

在实际应用中碰到的并不是简单警告框,而是提供更多功能的会话框

driver.find_element_by_id("show_modal")
div1=driver.find_element_by_class_name("modal-body").click()
div1.find_element_by_ib("click").click()
#多个div中都有button,使用tagname定位出来的是一组元素
buttons=driver.find_elements_by_tag_name("button")
buttons[1].click()
上传文件操作

文件上传操作也比较常见功能之一,上传功能没有用到新方法或函数,关键是思路

上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件
其实,只要定位上传按钮,通过send_keys添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件要存在

#打开网页
#定位上传按钮,添加本地文件【需要一个绝对的路径找到文件】
driver.find_element_by_name("file").send_keys('C:/Users/hp/Desktop/a.txt')
time.sleep(2)
driver.quit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值