Selenium-Python - Как сократить время на NoSuchElementException

У меня есть тестовый пример, в котором мне нужно проверить, что при щелчке по элементу всплывающее окно НЕ отображается. Этот код работает нормально, но он занимает слишком много времени, 60 секунд для исключения NoSuchElementException, распечатайте условие 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")

person Nisheeth    schedule 27.04.2018    source источник
comment
Используйте этот тег, если ваша проблема вызвана или в первую очередь связана с исключением NoSuchElementException в Java. Как это Java?   -  person What    schedule 27.04.2018
comment
Это не Ява. Это селен с Python   -  person Nisheeth    schedule 27.04.2018


Ответы (3)


Вы можете использовать явное ожидание.

WebDriverWait по умолчанию вызывает ExpectedCondition каждые 500 миллисекунд, пока он не вернется успешно в течение тайм-аута, в противном случае выбросить 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")

Более подробную информацию о явном ожидании и неявном ожидании можно найти здесь

person yong    schedule 27.04.2018

Непонятно, почему для вызова 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.

person DebanjanB    schedule 30.04.2018

Проверьте неявное значение ожидания вашего экземпляра драйвера. Если неявное значение установлено на 60 секунд, он будет ждать до 60 секунд, чтобы выбросить любые связанные с селеном исключения.

person Magesh    schedule 30.04.2018