Selenium WebDriver 中的WebDriverWait类 (等待)如何使用
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 方法。
使用自定义等待条件可以灵活地满足各种复杂的等待逻辑。可以根据具体的测试场景,编写相应的等待条件,以实现更精确的等待控制。
另外需要了解一个:
# 在此执行,后续的都会有效,作用于全局
# 必须加载完所有页面才执行代码,执行效率低
# 不适合用在数据在ajax的网站中,比如翻页
driver.implicitly_wait(10)
implicitly_wait 和 WebDriverWait 是 Selenium WebDriver 中用于等待的两种不同机制,主要区别在于等待的粒度和灵活性。
implicitly_wait: 该方法设置了一个全局的等待时间,适用于整个浏览器会话期间。它等待的时间是针对页面中的所有元素,一旦页面加载完成,等待就会结束。如果在设置的时间内找不到元素,则抛出NoSuchElementException异常。implicitly_wait更多的是用于解决元素加载时间过长的问题,但是它并不能对特定的元素进行等待。WebDriverWait: 与implicitly_wait不同,WebDriverWait提供了更细粒度的等待机制。它是针对某个特定的元素进行等待,一旦该元素出现,就会执行相应的操作。你可以设置一个特定的等待时间,如果在规定的时间内找不到元素,则会抛出TimeoutException异常。WebDriverWait可以对页面中的特定元素进行等待,灵活性更高。
总结来说,implicitly_wait 和 WebDriverWait 都有等待的功能,但是implicitly_wait是全局的等待设置,对所有元素有效,而WebDriverWait则是针对特定元素的等待设置,更加灵活。在选择使用哪种等待方式时,需要根据具体的测试需求来决定。

浙公网安备 33010602011771号