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
为了检查锚点是否设置为将用户带到正确的位置,我使用了两种类型的测试:
检查 a
元素上的 href
属性的值是否为“#”与它所指向的元素的 id
连接应该点。 (是的,我知道一般来说 URL 可能要复杂得多。我只是编写我的应用程序以便我 可以 执行这样一个简单的测试。)这会处理案例我有一个 a
元素只指向另一个元素,没有任何特殊的 JavaScript 处理。
对于更复杂的情况(例如,如果我在让浏览器滚动 window 之前拦截点击事件),我会在点击后检查元素的位置 相对于视口。 .location
字段的问题在于它是相对于文档的,因此不会随着滚动而改变。您可以获得相对于 viewport 的位置,如下所示:
position = driver.execute_script("""
var rect = arguments[0].getBoundingClientRect();
return {left: rect.left, top: rect.top};
""", element)
其中 element
是您想要的元素的坐标。 position
对象将是一个字典,其中 "left"
和 "top"
键对应于元素 的 x
和 y
坐标视口。如果元素靠近视口的顶部,那么 "top"
将为 0 或接近 0。事实是有时浏览器之间存在舍入问题或影响坐标的其他一些因素,因此我不会断言是否 "top"
正好是 0,但无论哪种方式我都会使用一些像素容差。
我不会使用屏幕截图比较来执行此测试,因为如果我更改了感兴趣的元素的样式,这样的测试肯定会失败,即使实际上代码没有问题。
我正在尝试检查 当我点击锚点 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
为了检查锚点是否设置为将用户带到正确的位置,我使用了两种类型的测试:
检查
a
元素上的href
属性的值是否为“#”与它所指向的元素的id
连接应该点。 (是的,我知道一般来说 URL 可能要复杂得多。我只是编写我的应用程序以便我 可以 执行这样一个简单的测试。)这会处理案例我有一个a
元素只指向另一个元素,没有任何特殊的 JavaScript 处理。对于更复杂的情况(例如,如果我在让浏览器滚动 window 之前拦截点击事件),我会在点击后检查元素的位置 相对于视口。
.location
字段的问题在于它是相对于文档的,因此不会随着滚动而改变。您可以获得相对于 viewport 的位置,如下所示:position = driver.execute_script(""" var rect = arguments[0].getBoundingClientRect(); return {left: rect.left, top: rect.top}; """, element)
其中
element
是您想要的元素的坐标。position
对象将是一个字典,其中"left"
和"top"
键对应于元素 的x
和y
坐标视口。如果元素靠近视口的顶部,那么"top"
将为 0 或接近 0。事实是有时浏览器之间存在舍入问题或影响坐标的其他一些因素,因此我不会断言是否"top"
正好是 0,但无论哪种方式我都会使用一些像素容差。
我不会使用屏幕截图比较来执行此测试,因为如果我更改了感兴趣的元素的样式,这样的测试肯定会失败,即使实际上代码没有问题。