在做网页或应用程序的自动化测试经过会出现找不到元素而报错的情况,很多时候是因为元素
还没有被加载出来,查找的代码就已经被执行了,自然就找不到元素了。那么我可以用等待
元素加载完成后再执行查找元素的代码。
Python里有三种等待的方式:
一、强制等待
睡眠(54)
这个方法在时间模块,使用时通过从进口睡眠时间导入
比如:
<代码>睡眠(10)#表示强行等待10年代再执行下一句代码 Driver.find_element_by_xpath (xxxxxx) 代码>
这种等待方式时间到了就执行下个语句,但比较死板,不能保证在等待的时间内元素真正被加载了出来。
二、隐性等待
Implicitly_wait (xxx)
这个等待表示在规定的时间内页面的所有元素都加载完了就执行下一步,否则一直等到时间截止,然后再继续下一步。
<代码>司机=webdriver.Chrome () Driver.implicitly_wait(10) #等待10年代 Driver.get (“XXX”) 代码>
这个方法的缺点是你需要的元素已经加载出来了,但页面还没有加载完,再需要继续等待页面加载完才能执行下一步操作。
看看第三种方法,比较灵活
三,显性等待
WebDriverWait,配合该类的,直到()和until_not()方法,表示程序每隔x秒去判断一下指
定的元素是否加载完,加载完了就执行下一步,否则继续每隔x秒去判断,指定时间截
止。如果超时就会抛出异常。
<代码>从硒webdriver进口 从selenium.webdriver.support。等进口WebDriverWait 从selenium.webdriver。支持导入expected_conditions EC 从selenium.webdriver.common.by进口 定位器=(By.XPATH,“xxxxxxx”) d=webdriver.Chorme () d.get (“http://www.sina.com”) WebDriverWait (d 10 1) .unitl (EC.presence_of_element_located(定位) 打印(" " XXX " ") 代码>
这里表示等待10年代,每隔1 s去检查一次元素是否出现,出现了就执行下一步,直到10 s
结束后还没有出现就会抛出异常。
实例讲解:(用了yuuwee的博客内容:https://www.cnblogs.com/yuuwee/p/6635652.html)
<代码> WebDriverWait(司机,10)除非(EC.title_is (u“百度一下,你就知道”)) “判断标题、返回布尔值” WebDriverWait(司机,10)除非(EC.title_contains (u“百度一下”)) “判断标题、返回布尔值” WebDriverWait(司机,10)除非(EC.presence_of_element_located ((By.ID,千瓦))) “判断某个元素是否被加到了dom树里,并不代表该元素一定可见,如果定位到就 返回WebElement” WebDriverWait(司机,10)除非(EC.visibility_of_element_located ((By.ID '苏'))) “判断某个元素是否被添加到了dom里并且可见,可见代表元素可显示且宽和高都大 于0” WebDriverWait(司机,10)除非(EC.visibility_of (driver.find_element (=By.ID价值=' https://www.yisu.com/zixun/kw '))) “判断元素是否可见,如果可见就返回这个元素” WebDriverWait(司机,10)除非(EC.presence_of_all_elements_located (By.CSS_SELECTOR, “.mnav”))) “判断是否至少有1个元素存在于dom树中,如果定位到就返回列表” WebDriverWait(司机,10)除非(EC.visibility_of_any_elements_located ((By.CSS_SELECTOR ,' .mnav '))) “判断是否至少有一个元素在页面中可见,如果定位到就返回列表” WebDriverWait(司机,10)除非(EC.text_to_be_present_in_element (By.XPATH”//* [@ id=' u1 ']/[8]”), u的设置的)) “判断指定的元素中是否包含了预期的字符串,返回布尔值” WebDriverWait(司机,10)除非(EC.text_to_be_present_in_element_value ((By.CSS_SELECT 或者,“苏#”),u '百度一下的)) “判断指定元素的属性值中是否包含了预期的字符串,返回布尔值” # WebDriverWait(司机,10)除非(EC.frame_to_be_available_and_switch_to_it(定位) “判断该帧是否可以开关进去,如果可以的话,返回真实并且开关进去,否 则返回假” #注意这里并没有一个帧可以切换进的去 WebDriverWait(司机,10)除非(EC.invisibility_of_element_located (By.CSS_SELECTOR #年代 wfEveryCookieWrap '))) “判断某个元素在是否存在于dom或不可见,如果可见返回假,不可见返回这个元素” #注意# swfEveryCookieWrap在此页面中是一个隐藏的元素 WebDriverWait(司机,10)除非(EC.element_to_be_clickable ((By.XPATH”//* [@ id=' u1 ']/[ 8]"))).click () “判断某个元素中是否可见并且是启用的,代表可点击” driver.find_element_by_xpath ("//* [@ id=鞍捌鳌盷/div [6]/[1]”) .click () # WebDriverWait(司机,10)除非(EC.element_to_be_clickable ((By.XPATH”//* [@ id=卑? 每']/div [6]/[1]”))) .click () # WebDriverWait(司机,10)除非(EC.staleness_of (driver.find_element (By.ID '苏'))) “等待某个元素从dom树中移除“ #这里没有找到合适的例子 WebDriverWait(司机,10)除非(EC.element_to_be_selected (driver.find_element (By.XPAT H, "//* [@ id=' nr ']/选择”[1]))) “判断某个元素是否被选中了,一般用在下拉列表” WebDriverWait(司机,10)除非(EC.element_selection_state_to_be (driver.find_element (。 XPATH, "//* [@ id=' nr ']/选择”[1]),真正的)) “判断某个元素的选中状态是否符合预期” WebDriverWait(司机,10)除非(EC.element_located_selection_state_to_be ((//By.XPATH。 * [@ id=' nr ']/选择”[1]),真正的)) “判断某个元素的选中状态是否符合预期” driver.find_element_by_xpath (“。//* [@ id=' gxszButton ']/[1]”) .click () 实例=WebDriverWait(司机,10)除非(EC.alert_is_present ()) “判断页面上是否存在警报,如果有就切换到警报并返回警报的内容” 打印instance.text instance.accept () driver.close()python里三种等待元素的方法