webdriver的三种等待 --chatGPT

以下内容全部基于与chatGPT的对话

一 三种等待方式

  1. 隐式等待(Implicit Wait): 使用隐式等待后,Webdriver 将在查找元素时等待一段时间,如果元素未立即出现,它会继续等待指定的时间,直到元素出现或超过最大等待时间为止。这适用于整个会话期间的所有元素查找操作。 例子:

    driver.implicitly_wait(10) # 设置隐式等待时间为10秒
    
  2. 显式等待(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")))
    
  3. 线程等待是一种简单的等待方式,它不依赖于特定的条件,而是通过暂停线程的执行来实现等待。使用线程等待时,需要指定等待的时间长度。线程等待不是最佳的等待方式,因为它会在等待期间停止线程的执行,无法灵活地响应页面的变化。

示例代码:

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 在查找元素时的等待时间,但它们之间有几个关键的区别:

  1. 等待范围:显示等待仅应用于您明确指定的某个元素或条件。您可以为每个操作指定具体的等待条件。而隐式等待将应用于整个 WebDriver 实例的生命周期,在查找任何元素时都会生效。
  2. 等待方式:显示等待通过显式编码来实现,您需要创建一个 WebDriverWait 对象,并使用预定义的等待条件来等待元素的特定状态。而隐式等待是一种全局设置,您只需在创建 WebDriver 对象之前设置一次即可,然后它将自动应用于所有后续查找操作。
  3. 触发条件:显示等待根据预定义的等待条件来判断何时满足等待条件,例如元素的可见性、可点击性等。而隐式等待是在执行每个查找元素的操作时,等待固定的时间,不管元素是否可见或可点击。
  4. 超时处理:显示等待允许您设置最长等待时间,并在超过该时间后抛出超时异常。这样可以更精确地控制等待的时间。而隐式等待只能设置一个固定的等待时间,无法精确控制超时时间。

综上所述,显示等待适用于需要精确等待某个特定条件的操作,它可以更精准地控制等待时间和条件。而隐式等待适用于整个测试过程中的每个查找元素的操作,它可以提供一个全局的等待时间,减少重复的等待代码编写。

二 只能使用显示等待

  1. 弹出框和模态框: 当页面中存在弹出框或模态框时,通常需要等待弹出框完全加载并出现在页面上,然后才能进行后续操作。由于隐式等待是基于元素查找的机制,在弹出框或模态框出现之前,它无法知道这些元素是否存在。因此,这种情况下需要使用显示等待来等待弹出框的出现。
  2. 动态加载的内容: 某些网页会通过异步加载或延迟加载的方式获取内容,这意味着在页面加载完成后,可能还需要一些时间才能完全呈现所有元素。使用隐式等待时,虽然可以等待页面的初始加载完成,但无法确保所有动态加载的内容都已经出现。在这种情况下,使用显示等待可以等待特定的元素或条件,以确保所需内容已经加载并可见。
  3. 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并根据需要进行配置。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要设置等待时间,可以使用WebDriver的`implicitly_wait()`方法。这个方法会在查找元素时等待一定的时间,如果在指定时间内找到了元素,则立即执行下一步操作;如果超过了指定时间还没找到元素,则抛出`NoSuchElementException`异常。例如,可以使用以下代码设置等待时间为10秒: ```python driver.implicitly_wait(10) ``` 这样在执行自动化测试时,如果某些页面元素加载稍慢,程序会等待最多10秒,如果在这个时间内找到了元素,就会继续执行下一步操作,否则会抛出异常。这样可以在一定程度上提高测试用例的执行效率。 然而,需要注意的是,`implicitly_wait()`方法并不能精确地控制等待时间,因为它会在查找元素时一直等待指定的时间。如果页面元素早就加载完成,但是仍然需要等待指定的时间才会继续执行下一步操作,这可能会导致测试用例的执行时间变长。为了更精确地控制等待时间,可以使用显式等待(Explicit Wait)机制,它可以根据具体的条件来等待,只等到满足条件时才会继续执行下一步操作。 另外,还可以使用隐式等待Implicit Wait)机制,它可以在整个测试过程中设置一个最长等待时间,如果在规定时间内页面元素被找到,则立即执行下一步操作,否则等到最长等待时间截止。可以使用以下代码设置隐式等待时间为10秒: ```python driver.implicitly_wait(10) ``` 使用隐式等待时,需要注意的是,它会应用于整个测试过程中的每个查找元素的操作,因此需要慎重考虑等待时间的设置,避免导致测试用例执行时间过长。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [options = webdriver.ChromeOptions()无弹窗经典python-selenium小练习](https://blog.csdn.net/kyaaaa1/article/details/87534998)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [selenium WebDriver3.0 等待时间设置方法](https://blog.csdn.net/qq_41596734/article/details/109224582)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值