【问题标题】:Assert correct scrolling position with selenium in python在 python 中使用 selenium 断言正确的滚动位置
【发布时间】:2020-09-01 14:03:59
【问题描述】:

我正在运行一个 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/,但找不到更好的解决方案或任何解决方案。

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

【问题讨论】:

    标签: python django selenium pytest-django


    【解决方案1】:

    您是否要单击它并检查它是否移到那里?因为您可以返回当前滚动高度以匹配元素位置。如果你愿意,你也可以得到 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")
    

    【讨论】:

    • 谢谢你!是的,我认为这就是我想要的。我认为在点击后断言滚动高度对我来说就足够了。但发生的情况是,在我单击导航栏中的联系人选项卡之前和之后,滚动高度是相同的。 (即使显示了页面的不同部分)。你知道为什么会这样吗?应该不一样吧?
    • 您可以使用类似于 rahul rai 的方式滚动到对象以单击它。
    • 是的,但我想断言,当我单击联系人选项卡时,它实际上会因为单击而移动到正确的位置。如果我使用测试代码移动到那里,我不会断言实际的点击将我带到那里。我想在点击改变后断言页面位置
    • 我认为应该与您推荐的代码一起使用,我只是很困惑为什么单击前后滚动位置相同
    • 啊是的,一定是这样...但是我可以用js以某种方式获得页面高度而不是滚动高度吗...?我试图将您的代码修改为return document.body.height,但它给了我None
    【解决方案2】:

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

        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
    

    【讨论】:

    • 谢谢拉胡尔!但它仍然给我之前和之后的相同坐标。认为实际的 click(), browser.find_element_by_css_selector(".nav-contact").click() 已经呈现了这个确切的部分。所以实际上没有涉及滚动,但点击已经将用户带到那里
    • 哦,我以为点击您的页面后正在加载,元素 e 是您所追求的位置。因此,正如您在单击“联系人”选项卡后所说的那样,您正在滚动到“联系人”部分。您可以在联系部分中找到任何元素吗?尝试使用 js 滚动到元素。 browser.execute_script(“arguments[0].scrollIntoView();”,element)。然后打印元素位置
    • 对不起,如果我不清楚。首先,我转到我的登录页面 (browser.get(live_server.url))。我打印位置。其次,我单击导航栏中的联系人选项卡 (...click())。这将移至同一页面上的联系人部分。我打印位置。两次都在同一位置{'x': 454, 'y': 2979}。当我尝试你的建议时也是同一位置browser.execute_script(“arguments[0].scrollIntoView();”,element)...但也许我在这里做错了
    • 我真正想要断言的是页面滚动到这个特定位置。这部分页面是用户查看的部分
    • 好吧,当您的页面正在加载时,您之前的元素会因为结果页面高度保持不变而消失。也很难以这种方式进行资产。请参阅我使用显示方法更新了答案。
    猜你喜欢
    • 2014-07-03
    • 2021-07-08
    • 1970-01-01
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多