以下内容全部基于与chatGPT的对话
一 三种等待方式
-
隐式等待(Implicit Wait): 使用隐式等待后,Webdriver 将在查找元素时等待一段时间,如果元素未立即出现,它会继续等待指定的时间,直到元素出现或超过最大等待时间为止。这适用于整个会话期间的所有元素查找操作。 例子:
driver.implicitly_wait(10) # 设置隐式等待时间为10秒
-
显式等待(Explicit Wait): 显式等待是通过编写自定义的等待条件来实现的。您可以设置等待的最长时间,以及等待期间的频率(每隔多久检查一次),直到满足特定条件或超时为止。 例子:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) # 设置显式等待时间为10秒 element = wait.until(EC.presence_of_element_located((By.ID, "myElement")))
-
线程等待是一种简单的等待方式,它不依赖于特定的条件,而是通过暂停线程的执行来实现等待。使用线程等待时,需要指定等待的时间长度。线程等待不是最佳的等待方式,因为它会在等待期间停止线程的执行,无法灵活地响应页面的变化。
示例代码:
import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.example.com")
time.sleep(5) # 线程等待5秒
element = driver.find_element_by_id("my-element")
element.click()
driver.quit()
这些等待方式可以根据不同的测试需求选择使用。隐式等待适用于全局等待,显示等待适用于特定条件的等待,而线程等待则是一种简单的固定时间等待方式。根据具体的场景和需求,选择适合的等待方式可以提高自动化测试的稳定性和可靠性。
二 显式等待(Explicit Wait)与expected_conditions.py
expected_conditions
是 Python Selenium 库中的一个模块,它提供了一组预定义的条件(Expected Conditions),用于等待元素的出现、可见、可点击等状态。
您可以使用 expected_conditions
模块来定义在显式等待中使用的条件,以便在特定条件满足或超时时继续执行。以下是一些常用的预定义条件:
presence_of_element_located(locator)
:判断元素是否存在于 DOM 中。visibility_of_element_located(locator)
:判断元素是否可见。visibility_of(element)
:判断元素是否可见。element_to_be_clickable(locator)
:判断元素是否可点击。text_to_be_present_in_element(locator, text_)
:判断某个元素的文本内容是否包含指定的文本。title_contains(title)
:判断当前页面的标题是否包含指定的文本。
这只是其中的一部分,还有其他预定义的条件可用。您可以根据需要选择适合的条件,并结合显式等待使用。下面是一个示例,演示如何使用 expected_conditions
进行显式等待:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10) # 设置显式等待时间为10秒
element = wait.until(EC.visibility_of_element_located((By.ID, "myElement")))
# 等待直到元素可见后继续执行其他操作
在上面的示例中,我们使用了 visibility_of_element_located
条件来等待元素可见。如果在指定的时间内元素未可见,则会抛出超时异常
三 显示等待与隐式等待的区别
一 区别
显示等待(Explicit Wait)和隐式等待(Implicit Wait)都是用于控制 Selenium Webdriver 在查找元素时的等待时间,但它们之间有几个关键的区别:
- 等待范围:显示等待仅应用于您明确指定的某个元素或条件。您可以为每个操作指定具体的等待条件。而隐式等待将应用于整个 WebDriver 实例的生命周期,在查找任何元素时都会生效。
- 等待方式:显示等待通过显式编码来实现,您需要创建一个 WebDriverWait 对象,并使用预定义的等待条件来等待元素的特定状态。而隐式等待是一种全局设置,您只需在创建 WebDriver 对象之前设置一次即可,然后它将自动应用于所有后续查找操作。
- 触发条件:显示等待根据预定义的等待条件来判断何时满足等待条件,例如元素的可见性、可点击性等。而隐式等待是在执行每个查找元素的操作时,等待固定的时间,不管元素是否可见或可点击。
- 超时处理:显示等待允许您设置最长等待时间,并在超过该时间后抛出超时异常。这样可以更精确地控制等待的时间。而隐式等待只能设置一个固定的等待时间,无法精确控制超时时间。
综上所述,显示等待适用于需要精确等待某个特定条件的操作,它可以更精准地控制等待时间和条件。而隐式等待适用于整个测试过程中的每个查找元素的操作,它可以提供一个全局的等待时间,减少重复的等待代码编写。
二 只能使用显示等待
- 弹出框和模态框: 当页面中存在弹出框或模态框时,通常需要等待弹出框完全加载并出现在页面上,然后才能进行后续操作。由于隐式等待是基于元素查找的机制,在弹出框或模态框出现之前,它无法知道这些元素是否存在。因此,这种情况下需要使用显示等待来等待弹出框的出现。
- 动态加载的内容: 某些网页会通过异步加载或延迟加载的方式获取内容,这意味着在页面加载完成后,可能还需要一些时间才能完全呈现所有元素。使用隐式等待时,虽然可以等待页面的初始加载完成,但无法确保所有动态加载的内容都已经出现。在这种情况下,使用显示等待可以等待特定的元素或条件,以确保所需内容已经加载并可见。
- Ajax请求的响应: 当页面中使用Ajax进行异步请求时,部分元素可能会在页面初始加载完成后才动态加载。隐式等待在初始页面加载完成后会立即执行后续操作,无法等待Ajax请求的响应完成。为了等待Ajax请求完成并获取到响应结果,需要使用显示等待来等待特定的条件或元素,以确保请求完成。
HTML示例代码:
<!DOCTYPE html>
<html>
<head>
<title>Dynamic Content Example</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
<div id="dynamic-content"></div>
<script>
// 使用Ajax请求动态加载数据
$(document).ready(function() {
$.ajax({
url: 'https://api.example.com/data',
success: function(response) {
$('#dynamic-content').text(response);
}
});
});
</script>
</body>
</html>
以上是一个前端页面示例,演示了通过Ajax请求加载数据:
在这个示例中,页面使用了jQuery库来发起Ajax请求,并将响应数据显示在dynamic-content
元素中。由于数据是通过Ajax请求加载的,隐式等待无法等待数据加载完成。而使用显示等待,我们可以等待dynamic-content
元素的文本内容不为空。
以下是使用WebDriver和显示等待来等待页面加载完成的Python代码:
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("file:///path/to/your/page.html")
wait = WebDriverWait(driver, 10)
element = wait.until(EC.text_to_be_present_in_element((By.ID, "dynamic-content"), ""))
print("Dynamic content loaded:", element.text)
driver.quit()
在这个示例中,我们使用WebDriver打开了前端页面,并使用显示等待来等待dynamic-content
元素的文本内容不为空。这样可以确保页面已经加载完成并显示了动态加载的内容。
请注意,上述示例代码中的file:///path/to/your/page.html
应替换为实际页面的文件路径或URL。此外,示例中使用了Python的Selenium库来进行WebDriver操作,您需要安装Selenium并根据需要进行配置。