Кажется, событие Selenium click () срабатывает не всегда => время ожидания истекло? - PullRequest
26 голосов
/ 11 марта 2009

Вот что я делаю:

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

// do something, then navigate to a different page 
// (window focus is never changed in-between)

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

Ссылка «mylink» существует, первый вызов click () всегда работает. Но второй щелчок () иногда работает, иногда нет.

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

Вот что я уже пробовал:

  1. Установить более длительное время ожидания
    => не помогло

  2. Ожидание наличия элемента после загрузки одной страницы
    => тоже не работает, так как страница даже не начинает загружаться

А пока я дважды вызывал click (), поэтому:

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

// do something, then navigate to a different page 
// (window focus is never changed in-between)

selenium.click("link=mylink");
selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

Это сработает, но это не очень хорошее решение. Я также видел на другом форуме, где кто-то предложил написать что-то вроде «clickAndWaitWithRetry»:

  try {
      super.click("link=mylink");
      super.waitForPageToLoad(60000);
  }
  catch (SeleniumException e) {
      super.click("link=mylink");
      super.waitForPageToLoad(60000);
  }

Но я думаю, что это тоже не правильное решение .... Любые идеи / объяснения, почему событие click () иногда не вызывается?

Ответы [ 14 ]

10 голосов
/ 29 июля 2009

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

selenium.click(...)

сделать

selenium.fireEvent( locator, 'click' );

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

<a href="javascript:...." >
4 голосов
/ 15 марта 2009

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

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

3 голосов
/ 06 июня 2011

Событие Selenium click () не всегда срабатывает => время ожидания истекло?

Попробуйте selenium.pause перед командой Selenium.click. Я попробовал все выше, но ни один из них, кажется, не решил нашу проблему. Итак, наконец мы получили Волшебную селеновую паузу, которая решила проблему для меня ..

Надеюсь, это решит и вашу проблему

3 голосов
/ 26 января 2010

Я только что попробовал WebDriver (Selenium 2.0) и обнаружил, что WebElement # sendKeys (Keys.ENTER) работает.

2 голосов
/ 30 июня 2011

У меня была такая же проблема - с Selenium 1.0.12 и Firefox 5.0; Мне удалось заставить автоматизированные тесты работать следующим образом:

  • Я удалил все команды "AndWait" (иногда они вешают тест / браузер)
  • Я добавил паузу перед щелчком
  • Я добавил waitForVisible после щелчка (обычно я жду следующего HTML-элемента управления, с которым я хочу взаимодействовать, на следующей странице).

Это выглядит так:

  • waitForVisible OK
  • пауза 1000
  • нажмите ОК
  • waitForVisible link = Go
  • пауза 1000
  • нажмите Go

и т.д ...

Кажется, что "waitForVisible" срабатывает слишком рано, то есть до того, как обработчик событий подключается к элементу управления (таким образом, нажатие на элемент управления не имеет никакого эффекта). Если вы подождите 1 секунду, достаточно подключить / активировать обработчики щелчков ...

2 голосов
/ 03 марта 2011

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

@browser.click(selector, {:wait_for => :page})

Не совсем уверен, почему это так. Но кажется, что если вы делаете:

@browser.click(selector)
   [maybe some stuff here too]
@browser.wait_for(:wait_for => :page)

Тогда вы можете ожидать страницу, которая уже была загружена (т. Е. Вы ждете вечно).

Я покопался в исходном коде Selenium и нашел этот слепок:

  def click(locator, options={})
    remote_control_command "click", [locator,]
    wait_for options
  end

...

  # Waits for a new page to load.
  #
  # Selenium constantly keeps track of new pages loading, and sets a
  # "newPageLoaded" flag when it first notices a page load. Running
  # any other Selenium command after turns the flag to false. Hence,
  # if you want to wait for a page to load, you must wait immediately
  # after a Selenium command that caused a page-load.
  #
  # * 'timeout_in_seconds' is a timeout in seconds, after which this
  #   command will return with an error
  def wait_for_page(timeout_in_seconds=nil)
    remote_control_command "waitForPageToLoad",
        [actual_timeout_in_milliseconds(timeout_in_seconds),]
  end
  alias_method :wait_for_page_to_load, :wait_for_page

По сути, это делает следующее:

@browser.click(selector)
@browser.wait_for(:wait_for => :page)

Однако, как говорится в комментарии, в первую очередь необходимо использовать команду: wait_for сразу после.

И, конечно ... переключение ордера переводит вас в одно и то же состояние ожидания навсегда.

@browser.wait_for(:wait_for => :page)
@browser.click(selector)

Не зная всех подробностей Selenium, кажется, что Selenium нужно зарегистрировать триггер: wait_for, когда он передается как опция с click . В противном случае вы могли бы в конечном итоге ждать вечно, если бы вы как-то приказали Selenium ждать в самый последний момент: вызывается wait_for.

2 голосов
/ 16 ноября 2010

Вот этот будет работать:

selenium.waitForPageToLoad("60000");

selenium.click("link= my link");
1 голос
/ 29 марта 2011

Если вы используете FireFox, убедитесь, что вы используете 3.6 или более позднюю версию. WaitForPageToLoad использует переменную javascript 'readyState', но Firefox поддерживает это только в версии 3.6. Более ранние версии просто не ждут

(см. org.openqa.selenium.internal.seleniumemulation.WaitForPageToLoad)

1 голос
/ 14 марта 2009

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

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

Это ожидание загрузки страницы, которая возвращается после щелчка. Но проблема, которую вы описываете, состоит в том, что она терпит неудачу при попытке сделать щелчок. Итак, не забудьте увеличить время ожидания до этого.

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);

// do something, then navigate to a different page 
// (window focus is never changed in-between)
// after the last click in these steps:
selenium.waitForPageToLoad(60000);
// anything else that happened after that

selenium.click("link=mylink");
selenium.waitForPageToLoad(60000);
1 голос
/ 14 марта 2009

Страница не загружается должным образом, когда вы нажимаете на нее. Проверьте наличие различных элементов на странице, чтобы убедиться, что страница загружена.

Кроме того, дождитесь, пока ссылка появится и станет видимой, прежде чем нажимать на нее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...