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

Python 使用Selenium时是否需要设置等待时间?,python,selenium,css-selectors,webdriverwait,nosuchelementexception,Python,Selenium,Css Selectors,Webdriverwait,Nosuchelementexception,有人说有必要设置等待时间,否则可能会因为页面未完成加载而导致NoTouchElementException错误 然而,我在低速网络上尝试了以下代码(没有任何排队等待)(我限制了速度),登录过程仍然平稳运行(起初它一直在加载,当我取消限制时,加载立即完成,事情继续…) 所以,我想知道当前Selenium中是否有自动等待模式,在最后一个进程完成之前不允许执行下一行? 是否仍有必要设置等待时间(例如,在我的代码中)?是根据最佳实践,您需要在使用时将等待时间设置为与其中任何一个一起使用 有关详细讨论,请

有人说有必要设置等待时间,否则可能会因为页面未完成加载而导致
NoTouchElementException
错误

然而,我在低速网络上尝试了以下代码(没有任何排队等待)(我限制了速度),登录过程仍然平稳运行(起初它一直在加载,当我取消限制时,加载立即完成,事情继续…)

所以,我想知道当前Selenium中是否有自动等待模式,在最后一个进程完成之前不允许执行下一行?
是否仍有必要设置等待时间(例如,在我的代码中)?

根据最佳实践,您需要在使用时将等待时间设置为与其中任何一个一起使用

有关详细讨论,请参见:


这个用例 根据您使用一组有效凭据登录的用例,您可以使用以下解决方案:

  • 代码块:

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


非接触性异常 您可以在以下内容中找到关于NoTouchElementException的两个详细讨论:


根据最佳实践,您需要设置等待时间,即服务生在使用时以与其中一种方式结合使用

有关详细讨论,请参见:


这个用例 根据您使用一组有效凭据登录的用例,您可以使用以下解决方案:

  • 代码块:

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


非接触性异常 您可以在以下内容中找到关于NoTouchElementException的两个详细讨论:


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

但是-更改页面加载超时不会导致
NoTouchElementException
,而是会引发不同的异常。如果要尝试设置,请执行以下操作:

driver.set_page_load_timeout(3)
速度有限的网络可能会导致一些故障


当谈到等待时——正如你所见,你并不需要等待。只有在某些特定场景下才需要它,例如动态内容更新、用户交互加载某些元素等。

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

但是-更改页面加载超时不会导致
NoTouchElementException
,而是会引发不同的异常。如果要尝试设置,请执行以下操作:

driver.set_page_load_timeout(3)
速度有限的网络可能会导致一些故障


当谈到等待时——正如你所见,你并不需要等待。只有在某些特定场景中才需要它,例如,动态内容得到更新,用户交互加载某些元素等。

动态加载内容时,动态加载内容时!你知道为什么在我的情况下错误没有发生吗?在加载成功或到达错误页面之前,“find_element…”行似乎不会执行。这就是为什么我怀疑添加“等待”的必要性。@TheCoolestStacker
加载成功
从Selenium的角度来看,这个术语非常主观<当您开始与动态元素交互时,代码>通过*与
隐式等待
结合使用查找元素在更大的范围内不会那么有效。因此,一个更好的方法是WebDriverWait,我在回答中已经提到了这一点。如果在初始页面加载之后没有发送额外的请求,那么您就不需要等待。所以它并不总是需要的,谢谢!你知道为什么在我的情况下错误没有发生吗?在加载成功或到达错误页面之前,“find_element…”行似乎不会执行。这就是为什么我怀疑添加“等待”的必要性。@TheCoolestStacker
加载成功
从Selenium的角度来看,这个术语非常主观<当您开始与动态元素交互时,代码>通过*与
隐式等待
结合使用查找元素在更大的范围内不会那么有效。因此,一个更好的方法是WebDriverWait,我在回答中已经提到了这一点。如果在初始页面加载之后没有发送额外的请求,那么您就不需要等待。因此,并不总是需要。同样值得注意的是,一些动态内容会用一个书签更新位置栏,该书签会在加载时触发。使用此方法的站点可能不需要webdriverwait。(这是一种可能已经过时的技术,但允许使用书签和适当的前向后退按钮功能。)hashchange事件触发动态加载。还值得注意的是,一些动态内容将使用启动onload的书签更新位置栏。使用此方法的站点可能不需要webdriverwait。(这是一种可能已经过时的技术,但允许使用书签和适当的前后按钮功能