Selenium - Получить местоположение после нажатия на якорь

Я пытаюсь проверить, что, когда я нажимаю ссылку на привязку, какой-то раздел действительно находится в верхней части браузера (я надеюсь, что у меня есть смысл здесь).

Мой тест выглядит так:

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 ответа

Другим подходом было бы щелкнуть ссылку и утверждать, что страница (или элемент, часть страницы) выглядит так, как нужно, сравнивая скриншоты с помощью пакета 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


Чтобы проверить, установлен ли якорь для ввода пользователя в нужное место, я использую два типа тестов:

  1. Убедитесь, что атрибут href a элемента a имеет значение, которое '#' конкатенируется с id элемента, которому он должен указывать. (Да, я знаю, в общем, URL может быть гораздо более сложным. Я просто закодировать свои приложения, так что я могу выполнить такой простой тест.) Это заботится о тех случаях, когда у меня есть a элемент, который просто указывает на другой элемент, без любая специальная обработка JavaScript.

  2. Для более сложных случаев (например, если я перехват событие щелчка, прежде чем позволить браузеру прокрутить окно), я проверяю местоположение элемента после нажатия на него относительно окна просмотра. Проблема с полем .location заключается в том, что она относится к документу и, таким образом, не изменяется при прокрутке. Вы можете получить позицию, относящуюся к окну просмотра, например:

    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, но я бы использовал допуск на несколько пикселей в любом случае.

Я бы не использовал сравнения скриншотов для выполнения этого теста, так как такой тест наверняка потерпит неудачу, если я изменил стиль интересующего элемента (ов), хотя на самом деле нет проблем с кодом.


Я бы сказал, вы используете 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}

Код, непосредственно взятый отсюда

licensed under cc by-sa 3.0 with attribution.