Selenium - 单击锚点后获取位置

Selenium - Get location after clicking on an anchor

我正在尝试检查 当我点击锚点 link 时,某些部分确实位于浏览器的顶部(我希望我这里说得通。)

我的测试是这样的:

class Tests(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome(chromedriver)
        self.accept_next_alert = True
        self.driver.set_window_size(1100, 800)
        self.base_url = "http://someurl"

    def test_anchor(self):
        driver = self.driver
        driver.get(self.base_url)
        driver.implicitly_wait(1)
        location = driver.find_element_by_xpath(
            "//section[@id='123123']").location
        print location

        driver.find_element_by_partial_link_text("anchor_text").click()
        location = driver.find_element_by_xpath(
            "//section[@id='123123']").location
        print location

        self.assertTrue(False)

这个断言只是为了让我能看到我的指纹。 我从中得到的是,即使我看到锚点有效,位置指令也保持不变。所以我想我没有使用正确的功能。

你能想出另一种方法来检查点击锚点是否达到了预期的效果吗? (要么不看位置,要么以正确的方式看位置)

我会说你使用 size 它给出了元素在点击前和点击后的绝对位置然后比较值。那将是实现该目标的最简单方法。

driver = webdriver.Firefox()
e = driver.find_element_by_xpath("//someXpath")
location = e.location
size = e.size
print(location)
print(size)

Returns:

{'y': 202, 'x': 165}
{'width': 77, 'height': 22}

代码直接取自here

另一种方法是单击 link 并通过在 cssneedle 包的帮助下比较屏幕截图来断言页面(或元素,页面的一部分)看起来应该是这样的:

from needle.cases import NeedleTestCase

class Tests(NeedleTestCase):
    def setUp(self):
        self.driver = webdriver.Chrome(chromedriver)
        self.accept_next_alert = True
        self.driver.set_window_size(1100, 800)
        self.base_url = "http://someurl"

    def test_anchor(self):
        driver = self.driver
        driver.get(self.base_url)
        driver.implicitly_wait(1)

        driver.find_element_by_partial_link_text("anchor_text").click()

        self.assertScreenshot('#my_element_id', 'screenshot-file-name')

要创建 screenshot-file-name 您需要先 运行 使用 --with-save-baseline 标志进行相同的测试:

nosetests my_test.py --with-save-baseline

为了检查锚点是否设置为将用户带到正确的位置,我使用了两种类型的测试:

  1. 检查 a 元素上的 href 属性的值是否为“#”与它所指向的元素的 id 连接应该点。 (是的,我知道一般来说 URL 可能要复杂得多。我只是编写我的应用程序以便我 可以 执行这样一个简单的测试。)这会处理案例我有一个 a 元素只指向另一个元素,没有任何特殊的 JavaScript 处理。

  2. 对于更复杂的情况(例如,如果我在让浏览器滚动 window 之前拦截点击事件),我会在点击后检查元素的位置 相对于视口.location 字段的问题在于它是相对于文档的,因此不会随着滚动而改变。您可以获得相对于 viewport 的位置,如下所示:

    position = driver.execute_script("""
    var rect = arguments[0].getBoundingClientRect();
    return {left: rect.left, top: rect.top};
    """, element)
    

    其中 element 是您想要的元素的坐标。 position 对象将是一个字典,其中 "left""top" 键对应于元素 xy 坐标视口。如果元素靠近视口的顶部,那么 "top" 将为 0 或接近 0。事实是有时浏览器之间存在舍入问题或影响坐标的其他一些因素,因此我不会断言是否 "top" 正好是 0,但无论哪种方式我都会使用一些像素容差。

我不会使用屏幕截图比较来执行此测试,因为如果我更改了感兴趣的元素的样式,这样的测试肯定会失败,即使实际上代码没有问题。