Python Selenium 部分API详细使用方法(三)

栏目: 编程语言 · Python · 发布时间: 6年前

内容简介:Python Selenium 部分API详细使用方法(三)

************************************************************************************************

六、获取页面的title和url

有时间需要通过页面的title和url去判断页面的状态。比如测试登录是否成功和重定向是否成功。

#获得前面 title,打印
title = driver.title
print title

#获得前面 URL,打印
now_url = driver.current_url
print now_url

************************************************************************************************

七、设置等待时间

有时候为了保证脚本运行的稳定性,需要脚本中添加等待时间。

设置等待时间有以下几种方法:

  • sleep(): 设置固定休眠时间。 python 的 time 包提供了休眠方法 sleep() , 导入 time包后就可以使用 sleep()进行脚本的执行过程进行休眠。
  • implicitly_wait():是 webdirver 提供的一个超时等待。隐的等待一个元素被发现,或一个命令完成。如果超出了设置时间的则抛出异常。
  • WebDriverWait():同样也是 webdirver 提供的方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。
  • 1、sleep()休眠方法

    当执行到sleep()方法时会固定休眠一定的时长,然后再往下执行。sleep()方法以秒为单位,假如休眠时间小于 1 秒,可以用小数表示。

    import time
    ....
    time.sleep(5)
    time.sleep(0.5)

    当然,也可以直接导入 sleep()方法,使脚本中的引用更简单

    from time import sleep
    ....
    sleep(3)
    sleep(30)

    2、implicitly_wait()

    隐式等待是通过一定的时长等待页面上某元素加载完成。如果超出了设置的时长元素还没被加载,则抛出NoSuchElementException异常。implicitly_wait()方法比 sleep() 更加智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。以秒为单位。注意:它并不针对页面上的某一个元素进行等待,而是从你设定这个隐式等待开始的所有需要定位的元素。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断判断元素是否定位到。超过设定时间抛出异常

    #添加智能等待30秒
    driver.implicitly_wait(30)

    3、WebDriverWait()

    详细格式如下:
    WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None),参数解释如下:

  • driver - WebDriver 的驱动程序(Ie, Firefox, Chrome 或远程)
  • timeout - 最长超时时间,默认以秒为单位
  • poll_frequency - 休眠时间的间隔(步长)时间,默认为 0.5 秒
  • ignored_exceptions - 超时后的异常信息,默认情况下抛 NoSuchElementException 异常。
  • from selenium.webdriver.support.ui import WebDriverWait
    ....
    element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))
    
    is_disappeared = WebDriverWait(driver, 30, 1, (ElementNotVisibleException)).until_not(lambda x: x.find_element_by_id(“someId”).is_displayed())

    WebDriverWai()一般由 unit()或 until_not()方法配合使用,下面是 unit()和 until_not()方法的说明:
    until(method, message=’’)
    调用该方法提供的驱动程序作为一个参数,直到返回值不为False。
    until_not(method, message=’’)
    调用该方法提供的驱动程序作为一个参数,直到返回值为 False。

************************************************************************************************

八、定位一组对象

需要获取页面上的一组元素是的方法:

#find_elements 用于获取一组元素。
find_elements_by_id(‘xx’)
find_elements_by_name(‘xx’)
find_elements_by_class_name(‘xx’)
find_elements_by_tag_name(‘xx’)
find_elements_by_link_text(‘xx’)
find_elements_by_partial_link_text(‘xx’)
find_elements_by_xpath(‘xx’)
find_elements_by_css_selector(‘xx’)

 可以使用for... in ...对这一组元素进行遍历

for checkbox in checkboxes:
checkbox.click()

我们获取到一组元素之后也可以使用pop()方法获得这一组元素中的第几个,然后再对该元素进行操作:

find_elements_by_id(‘xx’).pop().click()
  • pop()或pop(-1)默认获取一组元素中的最后一个
  • pop(0)   默认获取一组元素的第一个元素
  • pop(1)   默认获取一组元素的第二个元素
  • ......以此类推

************************************************************************************************

九、层级定位

在实际的项目测试中,经常会有这样的需求:页面上有很多个属性基本相同的元素 ,现在需要具体
定位到其中的一个。由于属性基本相当,所以在定位的时候会有些麻烦,这时候就需要用到层级定位。先
定位父元素,然后再通过父元素定位子孙元素。

比如下拉列表,我们可以先点击弹出下拉框然后再定位下拉列表中的选项

#点击 Link1 链接(弹出下拉列表)
driver.find_element_by_link_text('Link1').click()
#在父亲元件下找到 link 为 Action 的子元素
menu =
driver.find_element_by_id('dropdown1').find_element_by_link_text('Another
action')

************************************************************************************************

十、多表单切换

在 web 应用中经常会出现 frame/iframe 表单内嵌套的应用,WebDriver只能在一个页面上进行元素识别定位,对于frame/iframe表单内嵌页面上的元素无法直接定位。这是需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中。

driver.switch_to_frame("f2")

switch_to.frame()默认可以直接去表单的id或name属性。如果没有这两个属性,可以通过其他方式定位,比如:

#先通过xpath定位到iframe
xf=driver.find_element_by_xpath('/*[@class="if"]')
#再将定位对象传给switch_to.frame()方法
driver.switch_to.frame()

如果完成了在当前表单上的操作,则可以通过switch_to.parent_content()方法跳出当前一集表单。该方法默认对应于离他最近的switch_to.frame()。如果要跳出最外层的页面使用switch_to.default_conent().

************************************************************************************************

十一、多窗口切换

1、相关方法

current_window_handle:获得当前窗口句柄

window_handles:返回所有窗口的句柄到当前对话

switch_to.window(窗口句柄):切换到对应的窗口。

nowhandle=driver.current_window_handle
 driver.find_element_by_link_text(u"发表话题").click()
 time.sleep(3)
 #由于发表新话题会新窗口打开,所以要指向新窗口,即发话题窗口
 allhandles=driver.window_handles
  for handle in allhandles:
         if(handle!=nowhandle):
             driver.switch_to.window(handle)

************************************************************************************************

 十二、警告窗处理

处理javascript所生成的alert、confirm、prompt,可以使用switch_to_alert()方法定位到alert/confirm/prompt,然后使用text/accept/dismiss/send_keys等方法进行操作

  • text     返回 alert/confirm/prompt 中的文字信息。
  • accept      点击确认按钮。
  • dismiss     点击取消按钮,如果有的话。
  • send_keys     输入值,这个 alert\confirm 没有对话框就不能用了,不然会报错。

************************************************************************************************

十三、上传文件

 1、查找到input标签,通过send_keys添加文件路径

#通过查找到input标签,然后send进去
driver.find_element_by_id("coverImgSrc").send_keys(u"%s"%tds["coverImgSrc"])

 

************************************************************************************************

十四、调用javascript

当 webdriver 遇到没法完成的操作时,笔者可以考虑借用 JavaScript 来完成。使用webdriver 提供的execute_script() 接口用来调用 js 代码。比如要操作页面上隐藏的元素,可以用javascript来把它设置为可见然后进行操作

比如下面这段代码:

Python Selenium  部分API详细使用方法(三)

使用javascript:

Python Selenium  部分API详细使用方法(三)

……
#修改元素的属性
js = 'document.querySelectorAll("select")[0].style.display="block";'
driver.execute_script(js)

sel = driver.find_element_by_tag_name('select')
Select(sel).select_by_value('opel')

************************************************************************************************

十五、控制浏览器滚动条

一般用到操作滚动条的会两个场景:

  • 注册时的法律条文的阅读,判断用户是否阅读完成的标准是:滚动条是否拉到最下方。
  • 要操作的页面元素不在视觉范围,无法进行操作,需要拖动滚动条

用于标识滚动条位置的代码:

<body onload= "document.body.scrollTop=0 ">
<body onload= "document.body.scrollTop=100000 ">

如果滚动条在最上方的话, scrollTop=0 , 那么要想使用滚动条在最可下方, 可以 scrollTop=100000 ,
这样就可以使滚动条在最下方。

#将页面滚动条拖到底部
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)
time.sleep(3)
#将滚动条移动到页面的顶部
js1="var q=document.documentElement.scrollTop=0"
driver.execute_script(js1)
time.sleep(3)

************************************************************************************************

十六、获取元素对象的属性值

有时候我们定位页面上的元素发现常用的id、name等属性是相同的。这个时候我们只能通过常规的定位方法定位出一组元素,然后观察通过元素的属性可以定位出单个元素。可使用.get_attribute()方法。

比如:

# 选择页面上所有的 tag name 为 input 的元素
inputs = driver.find_elements_by_tag_name('input')
#然后循环遍历出 属性data-node值 为594434493的元素,单击勾选
for input in inputs:
if input.get_attribute('data-node') == '594434493':
input.click()
……

 

************************************************************************************************

 十七、获取验证码问题

关于验证码的处理,网上有几种说法:

1、测试时先去掉验证码

2、使用验证码识别技术

3、使用cookies记录登录用户名密码,下次自动登录免去验证码输入环节

我们自己内部的处理方式是内部提供一个接口获得验证码,然后通过js代码把获取的验证码填写进去:

#自动获取验证码并填写
        js="$.getJSON('http://xxx.xxx.com/util/getCode.jsonp?callback=?',function(data){$('.imgcode').val(data.code);})"
        driver.execute_script(js)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UML风格

UML风格

布格勒 / 袁峰 / 2008-12 / 35.00元

《UML风格(第2版)(英汉对照)》给出了一系列有效提高团队生产效率的编程风格的原则,描述了创建简洁、易于理解的UML图的标准和指南,涉及类图、定时图、用例图、组合结构图、顺序图、交互概览图、活动图、对象图、状态图、包图、通信图、部署图和组件图等内容。著名UML专家Scott W.Ambler描述了创建UML图的标准和指南,以帮助建模人员创建简明而易于理解的UML 图形。 《UML风格(第2......一起来看看 《UML风格》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具