Подтвердить что ты не робот

Кажется, что событие Selenium 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.waitForPageToLoad(60000);

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

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

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

  • Установите длительный тайм-аут

    = > не помогло

  • Дождитесь появления элемента после загрузки одной страницы
    = > не работает, так как страница даже не запускает загрузку

В настоящее время я дважды вызывал 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() иногда не запускается?

4b9b3361

Ответ 1

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

selenium.click(...)

делать

selenium.fireEvent( locator, 'click' );

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

<a href="javascript:...." >

Ответ 2

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

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

Ответ 3

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

Ответ 4

Событие Selenium click(), похоже, не всегда срабатывает = > приводит к таймауту?

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

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

Ответ 5

Здесь он будет работать:

selenium.waitForPageToLoad("60000");

selenium.click("link= my link");

Ответ 6

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

@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 триггер, когда он передается как опция с кликом. В противном случае, вы могли бы в конечном итоге ждать навсегда, если вы как-то скажете Selenium дождаться самого момента раньше: wait_for вызывается.

Ответ 7

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

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

Это происходит следующим образом:

  • waitForVisible OK
  • pause 1000
  • нажмите "ОК"
  • waitForVisible link = Go
  • pause 1000
  • нажмите Go

и т.д...

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

Ответ 8

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

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

Ответ 9

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

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);

Ответ 10

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

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

Ответ 11

Попробуйте следующее:

selenium.fireEvent(ID, "keypress");

Ответ 12

selenium.click("link=Continue to this website (not recommended).");
Thread.sleep(5000);

Ответ 13

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

Код С#:

var text = Selenium.GetText(myLocator);
Selenium.Click("link=" + text);

Ответ 14

У меня такая же проблема:( с selenium IDE 1.0.10, phpunit 3.5, selenium RC server 1.0.3

 EDITED: 
 The culprit seems to be browser FF 3.6.13 , after upgrade to FF 3.6.14
  all my errors are  gone . My tests are working like charm :). 

 Selenium IDE 1.0.10
 PHPUnit: 3.5.6
 Selenium Server:selenium-2.0b1 (selenium-2.0b2 is buggy)