使用 Selenium 时是否需要设置等待时间?

Is it necessary to set waiting time while working with Selenium?

有人说需要设置等待时间,否则可能会因为页面没有加载完成而导致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有没有自动等待模式,在最后一个进程完成之前不允许执行下一行? 是否仍然需要设置等待时间(例如在我的代码中)?

根据最佳实践,您需要设置一个等待时间,即服务员,形式为WebDriverWait in conjunction with either of the expected_conditions when using .

您可以在以下位置找到相关的详细讨论:

  • Do we have any generic funtion to check if page has completely loaded in Selenium

这个用例

根据您使用有效凭据在 website 中登录的用例,您可以使用以下解决方案:

  • 代码块:

    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()
    
  • 浏览器快照:


NoSuchElementException

您可以在以下位置找到关于 NoSuchElementException 的一些详细讨论:

Selenium 中的 默认 超时设置为 0。这意味着 Selenium 将在页面完成加载后抛出 NoSuchElementExpception 并且特定元素不存在于 DOM 中。默认的 page 加载超时非常高(我认为是 600 秒)- 这就是为什么您尝试的方法在网络不好时不会影响测试执行的原因。

但是 - 更改页面加载超时不会导致 NoSuchElementException 而是会抛出不同的异常。如果您想尝试这些设置:

driver.set_page_load_timeout(3)

在有限速度的网络下,您可能会遇到一些故障。

说到等待 - 正如您所见,您并不需要等待。仅在某些特定情况下才需要它 - 即更新动态内容、用户交互加载某些元素等。