Selenium WebDriver 中的WebDriverWait类 (等待)如何使用

发布时间 2023-08-17 01:10:38作者: sszqxt

WebDriverWait 是 Selenium WebDriver 中的一个类,用于等待直到某个特定的条件被满足。它是在 selenium.webdriver.support.ui 模块中定义的。

WebDriverWait 的基本用法如下:

1 from selenium.webdriver.support.ui import WebDriverWait  
2 from selenium.webdriver.support import expected_conditions as EC  
3 from selenium.webdriver.common.by import By  
4 from selenium.common.exceptions import TimeoutException  
5   
6 wait = WebDriverWait(driver, 10)  # 创建一个等待对象,等待时间不超过10秒  
7 element = wait.until(EC.presence_of_element_located((By.ID, 'my-id')))

在上述代码中:

  • WebDriverWait 接收两个参数:一个 WebDriver 对象和一个秒数。这个秒数表示最大等待时间。如果在指定的时间内条件没有满足,将会抛出一个 TimeoutException
  • EC.presence_of_element_located 是一个函数,它接收一个定位器(在这个例子中是 (By.ID, 'my-id'))并返回一个元素。如果元素不存在,这个函数会立即返回 None
  • wait.until 方法接收一个函数作为参数,并返回该函数的返回值。在这个例子中,它等待直到 EC.presence_of_element_located 返回一个元素,然后返回这个元素。

除了 EC.presence_of_element_located,Selenium 还提供了一些其他的等待条件,例如:

  • EC.visibility_of_element_located:等待直到元素可见。
  • EC.text_to_be_present_in_element:等待直到某个文本出现在某个元素中。
  • EC.element_to_be_clickable:等待直到元素可以点击。

这些等待条件都可以和 WebDriverWait 一起使用,以实现更复杂的等待逻辑。

除了上述的等待条件,Selenium 还提供了一些自定义等待的方式。如果默认的等待条件不能满足需求,可以使用 expected_conditions.custom_condition 创建一个自定义的等待条件。

下面是一个使用自定义等待条件的例子:

 

 1 from selenium.webdriver.support.ui import WebDriverWait  
 2 from selenium.webdriver.support import expected_conditions as EC  
 3 from selenium.webdriver.common.by import By  
 4 from selenium.common.exceptions import TimeoutException  
 5   
 6 def my_custom_condition(driver):  
 7     # 这里可以编写自定义的等待条件  
 8     return driver.find_element(By.ID, 'my-id').text == 'expected text'  
 9   
10 wait = WebDriverWait(driver, 10)  
11 element = wait.until(EC.custom_condition(my_custom_condition))

 

在上述代码中,my_custom_condition 是一个自定义的等待条件。它接收一个 WebDriver 对象作为参数,并返回一个布尔值。如果返回 True,则表示满足等待条件,否则表示不满足等待条件。

然后,使用 EC.custom_condition 将自定义的等待条件包装成一个 expected_conditions 的对象。最后,将这个对象作为参数传递给 WebDriverWait 的 until 方法。

使用自定义等待条件可以灵活地满足各种复杂的等待逻辑。可以根据具体的测试场景,编写相应的等待条件,以实现更精确的等待控制。

 

 

 

另外需要了解一个:

# 等待页面加载完毕,属于隐式等待,10秒钟内只要找到了元素就开始执行,10秒钟后未找到,就超时,会报NosuchElementError;
# 在此执行,后续的都会有效,作用于全局
# 必须加载完所有页面才执行代码,执行效率低
# 不适合用在数据在ajax的网站中,比如翻页
driver.implicitly_wait(10)
 
 
 
 

implicitly_wait 和 WebDriverWait 是 Selenium WebDriver 中用于等待的两种不同机制,主要区别在于等待的粒度和灵活性。

  1. implicitly_wait: 该方法设置了一个全局的等待时间,适用于整个浏览器会话期间。它等待的时间是针对页面中的所有元素,一旦页面加载完成,等待就会结束。如果在设置的时间内找不到元素,则抛出 NoSuchElementException 异常。implicitly_wait 更多的是用于解决元素加载时间过长的问题,但是它并不能对特定的元素进行等待。
  2. WebDriverWait: 与 implicitly_wait 不同,WebDriverWait 提供了更细粒度的等待机制。它是针对某个特定的元素进行等待,一旦该元素出现,就会执行相应的操作。你可以设置一个特定的等待时间,如果在规定的时间内找不到元素,则会抛出 TimeoutException 异常。WebDriverWait 可以对页面中的特定元素进行等待,灵活性更高。

总结来说,implicitly_wait 和 WebDriverWait 都有等待的功能,但是implicitly_wait是全局的等待设置,对所有元素有效,而WebDriverWait则是针对特定元素的等待设置,更加灵活。在选择使用哪种等待方式时,需要根据具体的测试需求来决定。