Ответ 1
Пройдя через переход сам. Если у вас был опыт Selenium 1, Selenium 2 чувствует себя совершенно по-другому. Вот мой Selenium 2 pros/cons против Selenium 1, который я вижу до сих пор (я использую Python, поэтому некоторые из них специфичны для Python):
Плюсы:
- Гораздо быстрее.
- Не нужно запускать отдельный сервер.
- Gone - wait_for_page_to_load(), wait_for_element_present() и т.д. Все взаимодействия элементов, клики и т.д. блокируют сейчас, что хорошо. Единственная проблема заключается в асинхронном загруженном контенте (Ajax), хотя см. Ниже.
Минусы:
- Загрузка/ожидание асинхронного содержимого, которое раньше было "бесплатным" с wait_for_page_to_load(), требует кодирования. Это решения, которые я нашел до сих пор:
- используйте PageFactory/AjaxElementLocatorFactory, как описано здесь, к сожалению, я не смог найти эквивалент для Python.
- используйте webdriver.implicitly_wait (N), похоже, это делает трюк с Python, но использование этого, кажется, заставляет мой script пропускать изменяющиеся элементы, которые он раньше обнаруживал.
- не выполняйте спящий режим (T), пока не появится элемент и т.д., который победит цель всего этого (и делает wait_for_page_to_load красивым)...
- Все это по-прежнему кажется немного сырым. Кажется, что разные драйверы и привязки пропускают разные функциональные возможности. Не сказать, что вы не можете использовать его, но будьте готовы найти "альтернативные решения" для определенных проблем.
- Документация немного сомнительна (относится к предыдущей точке, я думаю). Особенно для Python. Будьте готовы читать код и экспериментировать много (что, к счастью, легко с Python). Большинство "обучающих программ", которые вы найдете в Интернете (опять же, например, Python, Java, похоже, гораздо лучше), чтобы начать работу с самым простым веб-приложениями.
- Нет привязок к PHP, а не большой, я предпочитаю Python, но наш оригинальный набор был PHP, поэтому я заметил.
- Селенумэйд кажется бесполезным с селеном 2.
Другие отличия:
- Элементы страницы, к которым вы обращаетесь, должны быть "видимыми" на странице в тот момент, когда вы попросите селен найти их. Например, если у вас есть меню (содержащее список ссылок), которое открывается при наведении указателя мыши, вы должны убедиться, что оно открыто/видимо, прежде чем нажимать на ссылку внутри (что не было в Selenium 1). Это используется, поскольку вы будете тестировать то, что пользователь увидит на странице, но требует дополнительного кода. Я нашел два решения:
- запустите Javascript, который откроет ваше меню, в моем случае
driver.execute_script("document.getElementById('dashboard_menu_navigation').show()")
, затем щелкните пункт менюdriver.find_element_by_link_text('Orders').click()
- используйте классы "Мышь/Клавиатура" для имитации реального взаимодействия, это, кажется, сломано в привязках Python (см. выше):
- запустите Javascript, который откроет ваше меню, в моем случае
Пример (который бросает 'WebElement' object has no attribute 'mouse_move_to'
сегодня):
element=driver.find_element_by_id('mn_dashboard')
mouse=Mouse()
mouse.move_to(element)
Список "Против" кажется длинным, но это в основном, если вы пришли из Selenium 1. Я предпочитаю легкость и скорость Selenium 2 и, несмотря на ранний код (с использованием 2.0b4 на момент написания), все это довольно годные к употреблению.
Надеюсь немного сэкономить...