在 python 中使用 selenium 断言正确的滚动位置

Assert correct scrolling position with selenium in python

我是 运行 一个 django 应用程序,在那个范围内我有一个带有导航栏的页面,当我点击我的 contact-tab 时,它会自动向下滚动到我的联系人部分。

我正在尝试使用 selenium 测试此行为,但我似乎无法弄清楚如何测试页面的实际位置。或者,换句话说,我想验证页面是否确实向下滚动到联系人部分。

现在我正在这样做:

 def test_verify_position(
        self, browser, live_server
    ):
        """"""
        browser.get(live_server.url)
        contact_section = browser.find_element_by_id("contact").click()

        assert ????

我想我必须以某种方式获取当前滚动位置坐标。我知道我可以使用 .location 获取元素的位置。但是无论滚动位置如何,元素的相对位置始终相同。我试过这个来调试:

 def test_verify_position(
        self, browser, live_server
    ):
        """"""
        browser.get(live_server.url)
        e = browser.find_element_by_xpath(
            "/html/body/section[4]/div/div[1]/h2/strong")

        location = e.location
        print(location)

        browser.find_element_by_css_selector(".nav-contact").click()

        e = browser.find_element_by_xpath("/html/body/section[4]/div/div[1]/h2/strong")
        location = e.location
        print(location)

这会在滚动前后打印相同的坐标。

我也搜索了官方文档 https://www.selenium.dev/documentation/en/webdriver/web_element/ 但找不到更好的解决方案或任何解决方案。

有人知道怎么做吗?非常感谢您的帮助。提前致谢!

编辑:点击联系人导航后,您可以识别屏幕加载中的元素之一,并等待其可见。

    try:
        WebDriverWait(driver.visibility_of_element_located, 60).until(EC.presence_of_element_located((By.XPATH, '<xpath>')))
    except TimeoutException:
        assert False

需要导入:

from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

您是否要单击它并检查它是否移动到那里?因为你可以 return 当前滚动高度来匹配元素位置。如果您愿意,也可以获得 x,y 偏移量。

height = driver.execute_script("return document.body.scrollHeight")
print(height)
nav = browser.find_element_by_css_selector(".nav-contact")
location = nav.location
print(location)
browser.execute_script("arguments[0].scrollIntoView();",nav)
nav.click()
Assert.assertTrue(height.equals(location['y'])); 
#what the answer was
browser.execute_script("return window.pageYOffset")