我正在尝试检查这个事实,当我点击锚链接时,某些部分确实位于浏览器的顶部(我希望我在这里有意义。)
我的测试看起来像这样:
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)
断言就是这样,我可以看到我的照片。 我得到的是,即使我看到锚点工作,位置字典保持不变。所以我想我没有使用正确的功能。
你能想到另一种方法来检查锚点上的点击是否具有预期效果? (通过不查看位置或通过正确的方式查看位置或其他方式)
答案 0 :(得分:4)
要检查锚是否设置为将用户带到正确的位置,我使用两种类型的测试:
检查href
元素上的a
属性是否具有与其应指向的元素的id
连接的'#'值。 (是的,我知道一般来说URL可能要复杂得多。我只是编写我的应用程序代码,以便我可以执行这么简单的测试。)这样可以处理我{{1}的情况。只指向另一个元素的元素,没有任何特殊的JavaScript处理。
对于更复杂的情况(例如,如果我在让浏览器滚动窗口之前拦截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,但无论如何我都会使用几个像素的容差。
我不会使用屏幕截图比较来执行此测试,因为如果我更改了感兴趣的元素的样式,这样的测试肯定会失败,即使事实上代码没有问题。
答案 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
的代码