【问题标题】:Selenium - Get location after clicking on an anchorSelenium - 单击锚点后获取位置
【发布时间】:2015-03-26 16:00:26
【问题描述】:

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

我的测试是这样的:

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)

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

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

【问题讨论】:

  • 点击anchor后,您有什么期待?
  • @Saifur 页面滚动到特定部分 (<section id="123123"></section>)

标签: python testing selenium selenium-webdriver anchor


【解决方案1】:

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

  1. 检查a 元素上的href 属性的值是否与它应该指向的元素的id 连接在一起。 (是的,我知道通常 URL 可能要复杂得多。我只是对我的应用程序进行编码,以便我可以执行这样一个简单的测试。)这会处理我有 a 的情况只指向另一个元素的元素,没有任何特殊的 JavaScript 处理。

  2. 对于更复杂的情况(例如,如果我在让浏览器滚动窗口之前拦截点击事件),我会在点击元素后检查元素的位置相对于视口.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,但无论哪种方式,我都会使用一些像素容差。

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

【讨论】:

  • 有趣!肯定也会尝试的
【解决方案2】:

另一种方法是单击链接并在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

【讨论】:

  • 我想我会使用它,我现在必须进行一些其他测试,但我会尽快尝试重新处理这个问题并接受你的答案,如果它有效!谢谢
【解决方案3】:

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

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

返回:

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

代码直接取自here

【讨论】:

  • 关键是点击锚点前后的位置完全一样。对我来说这没有意义,因为我没有看到该部分,单击锚点,现在我在浏览器顶部看到它(它滚动到该部分)......或者我真的不明白你的答案
  • 我现在明白你要做什么了。我不会为我的测试做任何类似的事情。我很害怕,但selenium 没有任何内部机制来实现这一点。您可能必须使用一些第三方工具并比较之前和之后的图像捕获。然而,另一种可能的选择是使用JQuery offset() 看到这个answer
  • 好的,我正在寻找needle的截图,可能是个好主意,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2012-11-11
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多