Selenium - 点击锚点后获取位置

时间:2015-01-27 21:45:22

标签: python testing selenium selenium-webdriver anchor

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

我的测试看起来像这样:

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)

断言就是这样,我可以看到我的照片。 我得到的是,即使我看到锚点工作,位置字典保持不变。所以我想我没有使用正确的功能。

你能想到另一种方法来检查锚点上的点击是否具有预期效果? (通过不查看位置或通过正确的方式查看位置或其他方式)

3 个答案:

答案 0 :(得分:4)

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

  1. 检查href元素上的a属性是否具有与其应指向的元素的id连接的'#'值。 (是的,我知道一般来说URL可能要复杂得多。我只是编写我的应用程序代码,以便我可以执行这么简单的测试。)这样可以处理我{{1}的情况。只指向另一个元素的元素,没有任何特殊的JavaScript处理。

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

    .location

    其中position = driver.execute_script(""" var rect = arguments[0].getBoundingClientRect(); return {left: rect.left, top: rect.top}; """, element) 是您想要的坐标的元素。 element对象将是一个字典,其position"left"个键对应于元素相对于视口的"top"x坐标。如果元素靠近视口的顶部,则y将为0或接近0.事实是,有时从浏览器到浏览器的舍入问题或影响坐标的其他一些因素,所以我不会断言是否{ {1}}正好为0,但无论如何我都会使用几个像素的容差。

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

答案 1 :(得分:3)

另一种方法是点击链接,并通过在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

答案 2 :(得分:0)

我会说你使用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

的代码