WebDriver 中常用方法5---设置元素等待(虫师《selenium3自动化测试实战--基于Python语言笔记17》)

1.显示等待

webdriver等待某个条件成立则继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)

 webdriver 中提供了WebDriverWait()显示等待方法。

格式为:

# driver:浏览器驱动
# timeout:最长超时时间,默认以秒为单位
# poll_frequency:检测的间隔(步长)时间,默认0.5
# ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常
WebDriverWait(driver, timeout, poll_frequency=0.5,ignore_exceptions = None)
expected_conditions类提供的预期条件判断方法
方法 说明
title_is 判断当前页面的标题是否等于预期
title_contains 判断当前页面的标题是否包含预期字符串
presence_of_element_located 判断元素是否被加在DOM树里,并不代表该元素一定可见
visibility_of_element_located 判断元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于0)
visibility_of 与上个方法作用相同,上个参数为定位,本方法接收的参数为定位后的元素
presence_of_all_elements_located  

 判断是否至少有一个元素存在于DOM树中。

例如:页面中有n个元素class为“wp”,那么只要有个元素存在于DOM树中就返回True

 text_to_be_available_and_switch_to_it  判断该表单是否可以切换进去,如果可以,返回True并切换进去,否则返回False
 invisibility_of_element_located 判断某个元素是否不在DOM树中或不可见 
 element_to_be_clickable 判断某个元素是否可见并可以点击 
staleness_of 等到一个元素从DOM树中移除
element_to_be_selected 判断某个元素是否被选中,一般用在下拉列表中
element_selection_state_to_be 判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be 与上一个方法作用相同,只是上一个方法参数为定位后的元素,该方法接收的参数为定位
alert_is_present 判断呢页面上是否存在alert
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

# until(method,message=''):直到返回值为True;until_not():直到返回值为False
element = WebDriverWait(driver, 5, 0.5).until(
    EC.visibility_of_element_located((By.ID, "kw"))
)
element.send_keys("selenium")
driver.quit()

还可以利用is_displayed()实现显示等待

from selenium import webdriver
from time import sleep, ctime

driver = webdriver.Chrome()
driver.get("http://www.baidu.com")

print(ctime())
for i in range(10):
    try:
        el = driver.find_element_by_id("kw22")
        # is_displayed():判断元素是否可见
        if el.is_displayed():
            break
    except:
         pass
    sleep(1)
else:
    print("time out")
    print(ctime())

driver.quit()

执行结果如下:

Tue Sep 10 14:47:30 2019
time out
Tue Sep 10 14:47:41 2019

2.隐式等待

 webdriver中的implicitly_wait()方法可用来实现隐式等待。

from time import ctime
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

driver = webdriver.Firefox()

# 设置隐式等待10s
# 1.这10s并非固定等待时间,它并不影响脚本的执行速度。
# 2.它会等待页面上的所有元素
# 3.当脚本执行到某个元素定位时,如果元素存在,则继续执行;如果定位不到元素,则以轮询的方式不断地判断元素是否存在
driver.implicitly_wait(10) 
driver.get("http://www.baidu.com")

try:
    print(ctime())
    driver.find_element_by_id("kw22").send_keys("selenium")
except NoSuchElementException as e:
    print(e)
finally:
    print(ctime())
    driver.quit()

执行结果为:

Tue Sep 10 15:58:03 2019
Message: Unable to locate element: [id="kw22"]

Tue Sep 10 15:58:13 2019
原文地址:https://www.cnblogs.com/kite123/p/11481288.html