2015-03-13 5 views
1

Я пишу сценарии сценариев селена, используя отраслевой стандарт webdriver, перед тем, как взаимодействовать с элементами, я все же часто обнаруживаю, что мои тесты терпят неудачу, и, похоже, это связано с состоянием гонки.Что делать, если ждать элемента недостаточно?

Вот пример, который я был запущен в последнее время:

  1. Перейти к каталогу странице продукта
  2. применить фильтр
  3. Дождитесь фильтра, которая будет применяться
  4. Нажмите кнопку Сохранить на продукт, который загружается после подачи фильтра

Шаг № 4 работает только в том случае, если я помещаю Thread.Sleep() в f ront шага - с использованием webdriverwait недостаточно. Я предполагаю, что это связано с тем, что webdriverwait только ждет, пока элемент не будет присоединен к DOM, даже если соответствующее событие JavaScript не было добавлено в элемент.

Как вы обошли эту проблему? Существует ли промышленный стандарт для борьбы с этим состоянием гонки?

EDIT Это решение было устранено путем обновления до последней версии firefox. Всем спасибо!

+0

Какая ошибка при удалении нитьного сна? Это случай, когда кнопка отключена во время применения фильтра и включена ли фильтра post post? – shri046

+0

@ shri046 Кнопка сохранения загружается после применения фильтра. Когда я удаляю thread.sleep, ошибок нет. Selenium нажмет на кнопку сохранения.Проблема заключается в том, что ничего не происходит, когда селеновые клики (я предполагаю, что это происходит, потому что на момент нажатия кнопки кнопки javascript отсутствует кнопка, как только она загружается). Дайте мне знать, если я не объясню это хорошо. – GKS1

+0

Это имеет смысл, но мой вопрос был больше по строкам, так как кнопка «серая» на короткий период, пока применяется фильтр. Другими словами, кнопка, прикрепленная к DOM до и после применения фильтра, и единственным отличием является включение/отключение кнопки во время применения фильтра. – shri046

ответ

1

Как мы обнаружили в комментариях, обновление Firefox до последней версии сделал трюк.


Код выглядит очень хорошо для меня и имеет общий смысл.

То, что я хотел бы попробовать это двигаться к элементу, прежде чем сделать щелчок:

Actions builder = new Actions(WebDriver); 
IWebElement saveButton = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector(".button-wishlist"))); 

Actions hoverClick = builder.MoveToElement(saveButton).Click(); 
hoverClick.Build().Perform(); 

Как мы обнаружили, в комментариях, этот вопрос связан с размером окна (тест прошел без Thread.sleep(), если окно браузера максимально). Это заставляет меня думать, что если вы прокрутки к элементу прежде, чем сделать щелчок это может быть достаточно, чтобы заставить его работать:

IWebElement saveButton = wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector(".button-wishlist"))); 
((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].scrollIntoView(true);", saveButton); 

Actions hoverClick = builder.MoveToElement(saveButton).Click(); 
hoverClick.Build().Perform(); 
+0

Я просто попробовал это, и я вижу ту же проблему. :(Тест проходит только с Thread.Sleep() – GKS1

+0

@ GKS1 спасибо за попытку. Я буду играть с кодом больше и, надеюсь, вернется к вам. Вы видите это поведение независимо от используемого браузера? – alecxe

+0

@ GKS1 Я не мог воспроизвести эту проблему. Хотя я подошел к ней с помощью python, вот [gist] (https://gist.github.com/alecxe/30723d6a8c86f3778b29). Еще одна вещь, которую нужно попробовать: максимизировать окно после перейдя по URL-адресу. Спасибо. – alecxe

0

Взгляните на this SO post для метода пользовательского ожидания. Похоже, что присутствие элемента недостаточно для проверки вашего дела, потому что кнопка может присутствовать в DOM все время. Вам нужно что-то вроде линии ExpectedConditions.elementToBeClickable().

Я не знаком с C# API, но похоже, что нет встроенного метода для того же, что и в Java. Таким образом, вы можете написать пользовательскую функцию ожидания, которая будет проверяться в соответствии с вашими потребностями.

+0

Хорошее предложение, хотя элемент, который нужно щелкнуть, в основном проверяет, чтобы элемент был включен и виден ... это не помогло бы. Благодарю. – alecxe

+0

@alecxe Исправить. Кликабель от базового фреймворка должен работать для большинства общих случаев, и нужно будет полагаться только на пользовательское ожидание, если он не работает. Полностью зависит от реализации пользовательского интерфейса, который тестируется, но я хотел бы выделить оба варианта. – shri046

Смежные вопросы