在 python 中使用 selenium 断言正确的滚动位置
Assert correct scrolling position with selenium in python
我是 运行 一个 django 应用程序,在那个范围内我有一个带有导航栏的页面,当我点击我的 contact
-tab 时,它会自动向下滚动到我的联系人部分。
我正在尝试使用 selenium 测试此行为,但我似乎无法弄清楚如何测试页面的实际位置。或者,换句话说,我想验证页面是否确实向下滚动到联系人部分。
现在我正在这样做:
def test_verify_position(
self, browser, live_server
):
""""""
browser.get(live_server.url)
contact_section = browser.find_element_by_id("contact").click()
assert ????
我想我必须以某种方式获取当前滚动位置坐标。我知道我可以使用 .location
获取元素的位置。但是无论滚动位置如何,元素的相对位置始终相同。我试过这个来调试:
def test_verify_position(
self, browser, live_server
):
""""""
browser.get(live_server.url)
e = browser.find_element_by_xpath(
"/html/body/section[4]/div/div[1]/h2/strong")
location = e.location
print(location)
browser.find_element_by_css_selector(".nav-contact").click()
e = browser.find_element_by_xpath("/html/body/section[4]/div/div[1]/h2/strong")
location = e.location
print(location)
这会在滚动前后打印相同的坐标。
我也搜索了官方文档 https://www.selenium.dev/documentation/en/webdriver/web_element/ 但找不到更好的解决方案或任何解决方案。
有人知道怎么做吗?非常感谢您的帮助。提前致谢!
编辑:点击联系人导航后,您可以识别屏幕加载中的元素之一,并等待其可见。
try:
WebDriverWait(driver.visibility_of_element_located, 60).until(EC.presence_of_element_located((By.XPATH, '<xpath>')))
except TimeoutException:
assert False
需要导入:
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
您是否要单击它并检查它是否移动到那里?因为你可以 return 当前滚动高度来匹配元素位置。如果您愿意,也可以获得 x,y 偏移量。
height = driver.execute_script("return document.body.scrollHeight")
print(height)
nav = browser.find_element_by_css_selector(".nav-contact")
location = nav.location
print(location)
browser.execute_script("arguments[0].scrollIntoView();",nav)
nav.click()
Assert.assertTrue(height.equals(location['y']));
#what the answer was
browser.execute_script("return window.pageYOffset")
我是 运行 一个 django 应用程序,在那个范围内我有一个带有导航栏的页面,当我点击我的 contact
-tab 时,它会自动向下滚动到我的联系人部分。
我正在尝试使用 selenium 测试此行为,但我似乎无法弄清楚如何测试页面的实际位置。或者,换句话说,我想验证页面是否确实向下滚动到联系人部分。
现在我正在这样做:
def test_verify_position(
self, browser, live_server
):
""""""
browser.get(live_server.url)
contact_section = browser.find_element_by_id("contact").click()
assert ????
我想我必须以某种方式获取当前滚动位置坐标。我知道我可以使用 .location
获取元素的位置。但是无论滚动位置如何,元素的相对位置始终相同。我试过这个来调试:
def test_verify_position(
self, browser, live_server
):
""""""
browser.get(live_server.url)
e = browser.find_element_by_xpath(
"/html/body/section[4]/div/div[1]/h2/strong")
location = e.location
print(location)
browser.find_element_by_css_selector(".nav-contact").click()
e = browser.find_element_by_xpath("/html/body/section[4]/div/div[1]/h2/strong")
location = e.location
print(location)
这会在滚动前后打印相同的坐标。
我也搜索了官方文档 https://www.selenium.dev/documentation/en/webdriver/web_element/ 但找不到更好的解决方案或任何解决方案。
有人知道怎么做吗?非常感谢您的帮助。提前致谢!
编辑:点击联系人导航后,您可以识别屏幕加载中的元素之一,并等待其可见。
try:
WebDriverWait(driver.visibility_of_element_located, 60).until(EC.presence_of_element_located((By.XPATH, '<xpath>')))
except TimeoutException:
assert False
需要导入:
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
您是否要单击它并检查它是否移动到那里?因为你可以 return 当前滚动高度来匹配元素位置。如果您愿意,也可以获得 x,y 偏移量。
height = driver.execute_script("return document.body.scrollHeight")
print(height)
nav = browser.find_element_by_css_selector(".nav-contact")
location = nav.location
print(location)
browser.execute_script("arguments[0].scrollIntoView();",nav)
nav.click()
Assert.assertTrue(height.equals(location['y']));
#what the answer was
browser.execute_script("return window.pageYOffset")