IT评测·应用市场-qidao123.com

标题: 软件测试 —— Selenium(等待) [打印本页]

作者: 铁佛    时间: 2025-1-16 15:25
标题: 软件测试 —— Selenium(等待)
主动化测试的时候,我们代码的速度是比网页渲染的速度要快的多,如果我们代码都执行完了,网页还没有渲染好的话,就会出现一些题目,这个时候我们就得等待,等待网页渲染完毕之后才华进行交互:
一个例子

我们在百度搜索“老番茄”,然后点击他的百度百科:

  1. import time
  2. from selenium import webdriver
  3. from selenium.webdriver.common.by import By
  4. from selenium.webdriver.firefox.service import Service
  5. from webdriver_manager.firefox import GeckoDriverManager
  6. FireFoxIns = GeckoDriverManager().install()
  7. driver = webdriver.Firefox(service=Service(FireFoxIns))
  8. driver.get("https://www.baidu.com/")
  9. time.sleep(3)
  10. driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("老番茄")
  11. driver.find_element(By.CSS_SELECTOR,"#su").click()
  12. driver.find_element(By.CSS_SELECTOR,".pc-tag_2Nde8")
  13. driver.quit()
复制代码
然子女码会报错:
这是由于,我们代码执行的速度太快了网页还没有渲染完,这个时候自然也找不到百度百科的词条。
此时,我们可以在点击之后休眠3秒:
这个时候就没题目,由于网页已经渲染完了,这个时候百度百科的词条自然也就可以找得到了。这次乐成的原因是,我么在点击之后等待了3秒,这个时候网页已经渲染好了。所以,适当的等待可以让网页有充分的时间去渲染,接下来我们要学习三种等待方式:
强制等待

强制等待或硬编码等待的方式。这种方式通过使用编程语言提供的睡眠函数来实现,比如 Python 的 time.sleep() 函数。强制等待会暂停脚本执行一个指定的时间长度,岂论在这段时间内元素是否变得可用
强制等待是最简朴但也可能是最不保举的一种等待方式,由于它并不智能,也不思量实际的页面加载状态或元素停当环境。它只是简朴地暂停测试脚本一段固定的时间,这可能会导致测试时间不须要的延伸,而且在不同的网络环境或设备上表现不稳固。
使用示例:

  1. import time
  2. # 打开浏览器并导航到目标网页
  3. driver.get('http://example.com')
  4. # 强制等待5秒
  5. time.sleep(5)
  6. # 继续执行后续操作...
复制代码
为什么不保举使用强制等待?

   
  更好的选择

通常环境下,应该优先使用显式等待或 Fluent Wait 来处置惩罚动态内容,由于它们可以根据详细的条件来决定何时继承执行测试脚本,从而提供更可靠和高效的办理方案。
如果你确实必要在一个特定的位置添加短暂的停顿,比如为了让人眼观察某个动作的效果,可以思量使用较短的强制等待。但在主动化测试中,应只管制止使用强制等待,转而采用更加智能的等待计谋。
隐式等待 implicitly_wait()

在 Selenium WebDriver 中,重要提供了三种类型的等待机制来同步测试脚本与网页加载行为:
  1.    from selenium import webdriver
  2.    driver = webdriver.Chrome()
  3.    driver.implicitly_wait(10)  # 等待最长10秒
复制代码
隐式等待和强制等待的区别

隐式等待(Implicit Wait)和强制等待(Hardcoded Wait 或 Forced Wait)是两种不同的等待机制,它们在 Selenium WebDriver 中用于处置惩罚元素加载的时间题目。以下是两者的重要区别:
隐式等待(Implicit Wait)

                     
  1.    driver.implicitly_wait(10)  # 等待最长10秒
复制代码
强制等待(Hardcoded Wait 或 Forced Wait)

                         
  1.    import time
  2.    
  3.    time.sleep(5)  # 暂停5秒
复制代码
  
  表现等待 WebDriverWait(driver,sec).until(functions)

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.firefox.service import Service
  4. from selenium.webdriver.support.wait import WebDriverWait
  5. from selenium.webdriver.support import expected_conditions as EC
  6. from webdriver_manager.firefox import GeckoDriverManager
  7. FireFoxIns = GeckoDriverManager().install()
  8. driver = webdriver.Firefox(service=Service(FireFoxIns))
  9. try:
  10.     # 打开百度首页
  11.     driver.get("https://www.baidu.com/")
  12.     # 创建一个 WebDriverWait 实例,设置最大等待时间为10秒
  13.     wait = WebDriverWait(driver, 10)
  14.     # 等待搜索框出现并输入搜索关键词
  15.     search_box = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#kw")))
  16.     search_box.send_keys("老番茄")
  17.     # 等待搜索按钮出现并点击它
  18.     search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#su")))
  19.     search_button.click()
  20.     # 等待搜索结果中的特定元素出现
  21.     result_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".pc-tag_2Nde8")))
  22. finally:
  23.     # 完成后关闭浏览器
  24.     driver.quit()
复制代码
下面是一些方法
方法阐明title_is(title)检查页面标题是否等于指定的期望值。title_contains(partial_title)检查页面标题是否包含指定的区分大小写的子字符串。visibility_of_element_located(locator)检查元素是否存在于页面的DOM中而且是可见的。定位器用于指定要查找的元素。presence_of_element_located(locator)检查元素是否存在于页面的DOM中。定位器用于指定要查找的元素。visibility_of(element)检查已知存在于页面DOM上的元素是否可见。必要传入一个已经找到的元素对象。alert_is_present()检查是否有警告框(Alert)出现。 优点

   
  缺点

   
  表现等待和隐式等待的区别

表现等待(Explicit Wait)和隐式等待(Implicit Wait)是 Selenium WebDriver 中用于处置惩罚元素加载时间的两种不同机制。它们在实现方式、应用范围以及对测试稳固性的影响上都有显著的区别。以下是两者的重要区别:
表现等待(Explicit Wait)

   
     
     
     
     
   隐式等待(Implicit Wait)

   
     
     
     
     
   总结

   
  隐式等待和表现等待混用

我们这里混用隐式等待和表现等待,看看末了等待的时间是不是20s:
  1. try:
  2.     # 打开百度首页
  3.     driver.get("https://www.baidu.com/")
  4.     # 设置隐式等待时间为10秒
  5.     driver.implicitly_wait(10)
  6.     # 创建一个 WebDriverWait 实例,设置最大等待时间为10秒
  7.     wait = WebDriverWait(driver,10)
  8.     start = time.time()
  9.     # 输入搜索关键词并点击搜索按钮
  10.     search_box = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#kw")))
  11.     search_box.send_keys("老番茄")
  12.     # driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("老番茄")
  13.     search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#su")))
  14.     # driver.find_element(By.CSS_SELECTOR, "#su").click()
  15.     search_button.click()
  16.     # 尝试查找特定的元素(这里假设是搜索结果中的某个元素)
  17.     result_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".pc-tag_2Nde81"))) # 故意写错,看时间
  18.     driver.quit()
  19. except:
  20.     print("no such element")
  21.     end = time.time()
  22.     driver.quit()
  23. print(end-start)
复制代码

所以我们才说,不要混淆隐式和显式等待,可能会导致不可预测的等待时间

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4