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

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

  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() иногда не запускается?


person blackicecube    schedule 11.03.2009    source источник
comment
Обычно я использую setspeed вместо тайм-аута, когда по каким-то причинам хочу замедлить свой скрипт.   -  person    schedule 03.03.2011


Ответы (13)


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

selenium.click(...)

do

selenium.fireEvent( locator, 'click' );

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

<a href="javascript:...." >
person Andrew Martinez    schedule 29.07.2009
comment
Привет, я не мог заставить его работать, он все еще говорит, что он работал, но ничего не делает!. Команда click работает, но продолжает ждать загрузки страницы (когда этого не должно быть). Любое предложение? - person Diego Jancic; 02.11.2009
comment
У меня та же проблема, что и у Диего... Есть предложения? - person Ekaterina; 15.04.2010
comment
Элементы управления ASP.NET LinkButton автоматически превращаются в привязку с помощью javascript:__doPostback(* (при отображении в HTML).. достаточно просто превратить LinkButton в кнопку. Однако, если у вас есть жестко закодированный HTML-тег привязки, вызывающий JavaScript, вам может не повезти с этим инструментом Я думаю, что щелчок никогда не происходит, потому что Selenium использует JavaScript за кулисами и может переопределять работу якоря - вызовите JavaScript. - person MacGyver; 12.08.2011

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

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

person Eric Wendelin    schedule 15.03.2009
comment
Страница, которая показывает ссылку, полностью загружена (waitForElement успешно). Это просто обычная html-ссылка (‹a href=...›) без взаимодействия с JS. Ссылка находится в меню навигации, и, как я уже писал ранее, щелчок срабатывает в первый раз, но событие click(), похоже, не запускается во второй раз. - person blackicecube; 09.04.2009
comment
Эй, даже я столкнулся с проблемой с гиперссылками javascript. У меня есть кнопка с href=javascript:;. Когда я нажимаю на него с помощью selenium-rc, в строке состояния браузера отображается javascript:;, но никаких действий не происходит. Любые обходные пути для этого??? - Вамьип - person vamyip; 06.07.2010
comment
Первое, что я пытаюсь сделать, это использовать mouseDown и mouseUp вместо клика. Обычно это помогает, даже если это глупо. - person Eric Wendelin; 08.07.2010
comment
@blackicecube это действительно старо, но было бы неплохо, если бы вы поделились тем, что вы сделали в конце. Вы сказали, что страница полностью загружена, но, похоже, вы говорите о том, что до первого щелчка / как я уже упоминал в своем ответе, в вашем описании говорится, что вы переходите на другую страницу, так что это может означать, что проблема не загружена. - person eglasius; 08.07.2011

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

person Firefight    schedule 26.01.2010

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

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

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

person Sandeep Kumar    schedule 06.06.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.

person mdgreenfield    schedule 03.03.2011

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

selenium.waitForPageToLoad("60000");

selenium.click("link= my link");
person Vinesh    schedule 16.11.2010

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

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

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

  • ждатьForVisible ОК
  • пауза 1000
  • нажмите ОК
  • ссылка waitForVisible=Перейти
  • пауза 1000
  • нажмите Перейти

и т.д...

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

person Edot    schedule 30.06.2011

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

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

person Vijay Kotari    schedule 14.03.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);
person eglasius    schedule 14.03.2009

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

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

person racraman    schedule 29.03.2011

У меня такая же проблема :( с 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)
person sakhunzai    schedule 25.02.2011

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

Код С#:

var text = Selenium.GetText(myLocator);
Selenium.Click("link=" + text);
person Jesse Sanders    schedule 01.02.2011

Попробуй это:

selenium.fireEvent(ID, "keypress");
person Amine    schedule 21.04.2010