使用 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)
在有限速度的网络下,您可能会遇到一些故障。
说到等待 - 正如您所见,您并不需要等待。仅在某些特定情况下才需要它 - 即更新动态内容、用户交互加载某些元素等。
有人说需要设置等待时间,否则可能会因为页面没有加载完成而导致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)
在有限速度的网络下,您可能会遇到一些故障。
说到等待 - 正如您所见,您并不需要等待。仅在某些特定情况下才需要它 - 即更新动态内容、用户交互加载某些元素等。