网站建设订单模板下载,php网站后台页面,wordpress网址中文,辽宁建设工程质量监督站网站前言在使用python selenium进行自动化测试实践的过程中#xff0c;经常会遇到元素定位不到#xff0c;弹出框定位不到等等各种定位不到的情况#xff0c;在大多数的情况下#xff0c;无非是以下两种情况#xff1a;1、有frame存在#xff0c;定位前#xff0c;未switch到…前言在使用python selenium进行自动化测试实践的过程中经常会遇到元素定位不到弹出框定位不到等等各种定位不到的情况在大多数的情况下无非是以下两种情况1、有frame存在定位前未switch到对应的frame内2、元素未加载完毕(从界面看已经显示)但DOM树还在load状态或在加载js那对于这类情况怎么解决呢通俗的讲法 等待。高大上点解决自动化测试代码与浏览器加载渲染之间的同步问题。下面我们分段讲述各种处理方式一 强制等待这种方式简单粗暴直接有效不足的地方就是不够灵活。下面看下代码片段#_*_ coding:utf-8 _*___author__ 苦叶子from selenium import webdriverfrom time import sleep # 注意if __name__ __main__:driver webdrivrer.Firefox()driver.get(http://www.testingunion.com)sleep(3) # 强制等待3s在执行下一步print u当前url: , driver.currentsleep(3) #强制等待3s在执行下一步driver.quit()注 请注意加粗有删除线的代码行用于实现强制等待二、隐性等待webdriver提供了基础的同步方法隐性等待implicitly_wait(xx),该方式的意义是不论业务代码运行在那一步都需要等待webdriver xx秒如果在等待的xx秒内 webdriver完成了对应的动作则业务代码和webdriver都正常继续执行如果超过了xx秒webdriver还未完成对应的动作则业务代码继续执行而webdriver则会抛出异常(例如timeout或元素未找到等等异常)请看代码实现片段#_*_ coding:utf-8 _*___author__ 苦叶子from selenium import webdriverif __name__ __main__:driver webdrivrer.Firefox()driver.implicitly_wait(30) # 隐性等待最长等30sdriver.get(http://www.testingunion.com)print u当前url , driver.current_urldriver.quit()注上述代码中加粗删除线的代码通过调用webdriver提供的标准隐性等待方式来实现一种同步机制。其设置的是一个最长等待时间如果在规定的时间未完成则进入下一步。不足在实践中通常我们需要操作的元素已经显示出来但因网络或其他因素浏览器一直处于加载个别js或图片或其他资源时隐性等待模式下这时会依旧处于等待状态直至页面全部加载完毕才能进入下一步。那有没有更好的办法呢当然是有的请参见下一方式。重要隐性等待是全局性质的只需在driver实例化后设置一次即可。在实践中经常见到新手把隐性等待当做sleep来使用在每个步骤后都用一次。三、显性等待更为强大的方式是显性等待来实现同步机制需要WebDriverWait类辅以until()或until_not()方法根据判断条件进行灵活的同步它的主要机制是程序在规定的时间内每个xx秒看一下判断条件是否成立如果成立则执行下一步否则继续等待直至超过设置的最长时间然后抛出异常。请看具体的代码片段#_*_ coding:utf-8 _*___author__ 苦叶子from selenium import webdriverfrom selenium.webdriver.support.wait import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Byif __name__ __main__:driver webdrivrer.Firefox()# 隐性等待和显性等待可以同时用要注意的是最大等待时间取决两者之间的大值driver.implicitly_wait(10)driver.get(http://www.testingunion.com)locator (By.LINK_TEXT, uwebdriver)try:# 在最长20s内每个0.5秒去检查locator是否存在如果存在则进入下一步WebDriverWait(driver, 20, 0.5).until(EC.presence_of_located(locator))# 提取该文本对应的url并打印出来print driver.find_element_by_link_text(uwebdriver).get_attribute(href)finally:print u异常了driver.quit()在本示例中我们设置了隐性等待和显性等待在其他的操作中隐性等待起决定性作用在示例中的WebDriverWait设置了显性等待的地方则显性等待起决定性作用但要注意的是最长等待时间取决于两者之间的大值所以这里显性等待的最长时间为20s。在这里我们主要用到了WebDriverWait类和expected_conditions模块让我们近距离的接触下它们。WebDriverWait类定义实现在wait模块中实现了webdriver的显性等待机制先看下它有哪些参数和方法selenium.webdriver.support.wait.WebDriverWait(类)__init__(self,driver, # 传入实例化的webdriver对象timeout, # 超时时间等待的最大时间(需考虑同时考虑隐性等待时间)poll_frequencyPOLL_FREQUENCY, # 调用until或until_not方法的间隔时间上例为0.5signored_exceptionsNone #指定忽略的异常如果指定了要忽略的异常类型则在调用until或until_not过程中捕获该类异常时不中断代码继续等待。默认只有NoSuchElementException)until(self,method, # 在等待期间每个一段时间调用这个传入的方法直到返回值为falsemessage # 如果超时则抛出TimeoutException将message传入给异常)until_not 与until相反until是当某个元素满足某种条件时(出现、存在等等)继续执行until_not则是当某个元素不满足某种条件时继续执行参数含义相同特别注意很多时候大家在使用until或until_not时会将一个WebElement对象传入给method如下WebDriverWait(driver, 10).until(driver.find_element_by_id(kw)) # 这是错误的用法这里的参数一定要是可调用的这个对象一定要有__call__()方法否则会抛出异常TypeError xxx object is not callable在这里也可以用selenium2提供的expected_conditions模块中提供的各种条件也可用WebElement中的is_displayed()is_selected()is_enabled()方法或是自己封装的方法均可。下面我们再看看selenium提供了哪些条件如图所示结束语本文就python selenium三种同步解决方式进行了较为详细的说明这是使用selenium进行自动化测试实践的必备技能希望对大家有所帮助。