【问题标题】:Selenium-Python - How to reduce time for NoSuchElementExceptionSelenium-Python - 如何减少 NoSuchElementException 的时间
【发布时间】:2018-04-27 20:09:54
【问题描述】:

我有一个测试用例,我需要检查单击元素时是否不显示弹出窗口。这段代码运行良好,但是 NoSuchElementException 需要 60 秒,打印 PASS 条件并转到下一个测试用例。在这种情况下如何减少等待时间?

driver.find_element_by_xpath(
".//*[@id='assetIdDIV']/div/myaots-input/div/div/div[1]/span/i[2]"
).click()

try:
    DUP_popup = driver.find_element_by_xpath(
    ".//*[@id='DuplicateTicketsPopup']/div/div/div/div[1]/span[2]/img"
    )

    if (DUP_popup):
        print ("Duplicate tkts popup is displayed - Fail")

except NoSuchElementException:
        print ("Duplicate popup not displayed - PASS")

【问题讨论】:

  • "如果您的问题是由或主要涉及 Java 中的 NoSuchElementException 引起的,请使用此标记。"这个java怎么样?
  • 这不是 Java。这是使用 Python 的 Selenium

标签: python selenium selenium-webdriver webdriver nosuchelementexception


【解决方案1】:

您可以使用显式等待。

WebDriverWait 默认每 500 次调用 ExpectedCondition 毫秒,直到它在超时内成功返回, 否则抛出 TimeoutException

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
  DUP_popup = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPath, 
      "//*[@id='DuplicateTicketsPopup']/div/div/div/div[1]/span[2]/img"))
  )

  # This waits up to 10 seconds before throwing a TimeoutException 
  # unless it finds the element to return within 10 seconds.

  if (DUP_popup):
    print ("Duplicate tkts popup is displayed - Fail")

except TimeoutException:
  print ("Duplicate popup not displayed - PASS")

关于显式等待和隐式等待的更多细节可以找到here

【讨论】:

    【解决方案2】:

    不清楚为什么引发 NoSuchElementException 并打印 pass 条件需要长达 60 秒的时间,但您可以通过服务员诱导来配置等待时间WebDriverWait如下:

    driver.find_element_by_xpath(".//*[@id='assetIdDIV']/div/myaots-input/div/div/div[1]/span/i[2]").click()
    if(len(WebDriverWait(driver, 20).until(EC.presence_of_all_elements_located((By.XPATH, ".//*[@id='DuplicateTicketsPopup']/div/div/div/div[1]/span[2]/img"))))!= 0):
        print ("Duplicate tkts popup is displayed - Fail")
    else:
        print ("Duplicate popup not displayed - PASS")
    

    注意:如果您的程序包含 _implicitly_wait()_,您需要删除 _implicitly_wait()_ 的实例,因为文档清楚地提到了Do not mix implicit and explicit waits. Doing so can cause unpredictable wait times.

    【讨论】:

      【解决方案3】:

      检查您的驱动程序实例的隐式等待值。如果隐式值设置为 60 秒,那么它将等到 60 秒才抛出任何与硒相关的异常。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 2013-10-21
        • 2016-12-10
        相关资源
        最近更新 更多