Нужно ли устанавливать время ожидания при работе с Selenium? - PullRequest
0 голосов
/ 04 июня 2019

Некоторые говорили, что необходимо установить время ожидания, иначе это может вызвать ошибку NoSuchElementException, так как страница не закончила загрузку.

Однако я попробовал следующий код (без каких-либо ожидающих строк) с низкоскоростной сетью (я ограничил скорость), и процесс входа в систему все еще проходил гладко (сначала он продолжал загружаться, а когда я отменял)предел, загрузка сразу завершилась и все пошло дальше ...).

from selenium import webdriver
import json

# Get user info
with open('wjxlogin.json', encoding='utf-8') as fp_login:
    login = json.load(fp_login)
username = login['username']
password = login['password']

# First login
browser = webdriver.Firefox()
browser.get('https://www.wjx.cn/login.aspx')
browser.find_element_by_id('UserName').send_keys(username)
browser.find_element_by_id('Password').send_keys(password)
browser.find_element_by_id('RememberMe').click()
browser.find_element_by_id('LoginButton').click()

Итак, мне интересно, есть ли автоматический режим ожидания в текущем Selenium, который не позволяет выполнять следующую строку до последнейпроцесс закончен?И все еще необходимо установить время ожидания (в моем коде, например)?

Ответы [ 2 ]

2 голосов
/ 04 июня 2019

Тайм-аут по умолчанию в Selenium установлен на 0 .Это означает, что Selenium будет выдавать NoSuchElementExpception после того, как страница завершит загрузку, а конкретный элемент отсутствует в DOM .По умолчанию page время ожидания загрузки довольно велико (я думаю, что оно составляет 600 секунд) - поэтому то, что вы пробовали, не повлияло на выполнение теста, когда сеть была плохой.

Однако - изменениевремя ожидания загрузки страницы не приведет к NoSuchElementException, вместо этого будет выдано другое исключение.Если вы хотите поэкспериментировать с настройками:

driver.set_page_load_timeout(3)

Вероятно, вы получите некоторые сбои в сети с ограниченной скоростью.

Когда дело доходит до ожидания - как вы сами видели, вам не нужноЭто.Требуется только в некоторых конкретных сценариях - то есть динамическое содержимое обновляется, взаимодействие с пользователем загружает некоторые элементы и т. Д.

0 голосов
/ 04 июня 2019

Да В соответствии с лучшими практиками, вам нужно установить время ожидания, например официант в виде WebDriverWait в сочетании с любым из Ожидаемые условия при использовании Селен .

Соответствующее подробное обсуждение можно найти в:


Этот вариант использования

В соответствии с вашим сценарием для входа на веб-сайт с использованием действительного набора учетных данных вы можете использовать следующее решение:

  • Кодовый блок:

    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC 
    
    options = webdriver.ChromeOptions() 
    driver = webdriver.Chrome(options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    driver.get("https://www.wjx.cn/login.aspx")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.validate-input.user-name#UserName"))).send_keys("TheCoolestStacker")
    driver.find_element_by_css_selector("input#Password[name='Password']").send_keys("TheCoolestStacker")
    driver.find_element_by_css_selector("input#RememberMe[name='RememberMe']").click()
    driver.find_element_by_css_selector("input.submitbutton#LoginButton").click()
    
  • Снимок браузера:

login_wait


NoSuchElementException

Вы можете найти несколько подробных обсуждений по NoSuchElementException в:

...