【问题标题】:Selenium: Edge webdriver not waiting for page to load before executing next step (python)Selenium:Edge webdriver 在执行下一步之前不等待页面加载(python)
【发布时间】:2020-04-03 14:18:57
【问题描述】:

我正在使用 selenium 和 Python 编写一些测试。到目前为止,我的套件与 Chrome 和 Firefox 完美配合。但是,当我尝试使用 Edge (EdgeHTML) 时,相同的代码不起作用。在撰写本文时,我使用的是最新版本,即版本 17134,版本:6.17134。我的测试在 Windows 10 上运行。

问题是 Edge 没有等待页面加载。作为每个测试的一部分,首先执行登录。输入凭据并提交表单。 Firefox 和 Chrome 现在将等待我们被重定向到的页面加载。但是,使用 Edge,只要单击登录提交按钮,就会执行下一个代码,这当然会导致测试失败。

这是 Edge 的错误吗?这似乎有点太根本了。浏览器是否需要以某种方式进行配置?我在文档中看不到任何内容。

这是我们登录时使用最后一条语句运行的代码,导致重定向:

self.driver.find_element_by_id("login-email").send_keys(username)
self.driver.find_element_by_id("login-password").send_keys(password)
self.driver.find_element_by_id("login-messenger").click()

Edge 决定它不需要等待,然后将执行下一个导航到受保护页面的代码。代码是:

send_page = SendPage(driver)
send_page.load_page()

更简洁:

self.driver.find_element_by_id("login-messenger").click()
# should wait now for the login redirect before excuting the line below but it does not!
self.driver.get(BasePage.base_url + self.uri)

我可以通过等待扩展页面上的元素出现来执行解决方法,从而使 Edge 等待。感觉这不是正确的做法。我当然不想只为 Edge 进行侵入性更改。

有什么建议吗?

【问题讨论】:

  • 用你的代码试验更新问题。
  • 您可以导入时间包并使用time.sleep(secs) method或使用WebDriverWait()等待页面加载。
  • 我可以做一个 WebDriverWait() 并在我知道应该加载的页面上寻找一些东西。它不会影响其他浏览器,但我不愿意做我认为不应该做的事情。此问题的目的是查看这是否是已确定的解决方法的已知问题,或者找出我是否做错了什么。

标签: python-3.x selenium automated-tests microsoft-edge


【解决方案1】:

这是 Edge 的错误吗?这似乎有点太基本了 案子。浏览器是否需要以某种方式进行配置?一世 在文档中看不到任何内容。

不,我认为这不是 Edge 浏览器的错误。由于浏览器性能的差异,或许Edge浏览器会花费更多的时间来加载页面。

一般情况下,我们可以使用time.sleep(secs) methodWebDriverWait() method and implicitly_wait() method来等待页面加载。

下面的代码块向您展示了如何等待页面加载完成。它使用超时。它等待一个元素显示在页面上(您需要一个元素 ID)。 然后,如果页面已加载,则显示页面已加载。如果超时时间(以秒为单位)已过,则会显示超时错误。

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

driver = webdriver.Firefox()
driver.get('https://pythonbasics.org')
timeout = 3
try:
    element_present = EC.presence_of_element_located((By.ID, 'main'))
    WebDriverWait(driver, timeout).until(element_present)
except TimeoutException:
    print("Timed out waiting for page to load")
finally:
    print("Page loaded")

更多详细信息,请查看以下文章。

Wait until page is loaded with Selenium WebDriver for Python

How to wait for elements in Python Selenium WebDriver

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多