Сделайте так, чтобы безголовый браузер прекратил загрузку страницы - PullRequest
8 голосов
/ 26 марта 2012

Я использую рубиновый камень watir-webdriver.Запускает браузер (Chrome) и начинает загружать страницу.Страница загружается слишком медленно, и watir-webdriver вызывает ошибку тайм-аута.Как сделать так, чтобы браузер прекратил загрузку страницы?

require 'watir-webdriver'

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 10
@browser = Watir::Browser.new :chrome, :http_client => client

sites = [
  "http://google.com/",
  "http://yahoo.com/",
  "http://www.nst.com.my/", # => This is the SLOW site
  "http://drupal.org/",
  "http://www.msn.com/",
  "http://stackoverflow.com/"
]

sites.each do |url|

  begin
    @browser.goto(url)
    puts "Success #{url}"
  rescue
    puts "Timeout #{url}"
  end

end

########## Execution result ########## 

# Success http://google.com/
# Success http://yahoo.com/
# Timeout http://www.nst.com.my/
# Timeout http://drupal.org/
# Timeout http://www.msn.com/
# Timeout http://stackoverflow.com/

########## Expected result ########## 

# Success http://google.com/
# Success http://yahoo.com/
# Timeout http://www.nst.com.my/
# Success http://drupal.org/
# Success http://www.msn.com/
# Success http://stackoverflow.com/

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

ОБНОВЛЕНО

Я обнаружил интересный флаг возможности loadAsync http://src.chromium.org/svn/trunk/src/chrome/test/webdriver/webdriver_capabilities_parser.cc Возможно, он можетбыть полезным для решения этой проблемы?Я пока не понимаю, как сделать watir (webdriver), чтобы установить это при запуске chromedriver.Этот флаг был введен здесь http://codereview.chromium.org/7582005/

Ответы [ 4 ]

4 голосов
/ 26 марта 2012

Есть несколько способов сделать то, что вы хотите, но вот что я бы сделал:

require 'watir-webdriver'

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 60 
@browser = Watir::Browser.new :firefox, :http_client => client

begin
  @browser.goto mySite
rescue => e
  puts "Browser timed out: #{e}"
end

next_command

Если у вас много сайтов, которые вы пытаетесь загрузить для подтверждениятаймаут или нет, поместите их в массив:

mySites = [
          mySite1,
          mySite2,
          mySite3
]

mySites.each do |site|
   begin
      @browser.goto site
   rescue
      "Puts #{site} failed to load within the time allotted."
   end
end

ОБНОВЛЕНИЕ для подтверждения концепции.Этот сценарий всегда переходит к шагу 2. Спасение даже не требуется для второго перехода, но используется для более четкого вывода.Чем ваш сценарий отличается от этого?

require 'watir-webdriver'

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 1     #VERY low timeout to make most sites fail
@browser = Watir::Browser.new :firefox, :http_client => client


def testing
   begin
     @browser.goto "http://www.cnn.com"
   rescue => e
     puts "Browser timed out on the first example"
   end

   begin
     @browser.goto "http://www.foxnews.com"
   rescue => e
     puts "Browser timed out on the second example"
   end
end
2 голосов
/ 27 марта 2012

Вы можете остановить загрузку страницы Google с помощью AutoIT для отправки клавиши Escape. Это похоже на то, что вы изначально пытались сделать, но используя AutoIT напрямую, а не через сломанный объект Watir :: Browser.

require 'watir-webdriver'
require 'win32ole'

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 5
@browser = Watir::Browser.new :chrome, :http_client => client
begin
    @browser.goto "http://www.nst.com.my/"
rescue
    autoit = WIN32OLE.new("AutoItX3.Control")
    autoit.AutoItSetOption("WinTitleMatchMode", 2) 
    autoit.WinActivate("Google")
    autoit.Send("{ESC}")
end
@browser.goto "http://www.google.ca"

Примечание. Я попытался заставить autoit.ControlSend("Google", "", "", "{ESC}") работать, чтобы браузер не был активным окном. Хотя он работал сам по себе, по какой-то причине я никогда не мог заставить его работать в приведенном выше сценарии (то есть ключ был отправлен, но браузер не отреагировал должным образом).

0 голосов
/ 04 февраля 2015

У меня тоже была проблема тайм-аутов. Насколько я понимаю из онлайн-исследований, после того, как Selenium WebDriver сталкивается с тайм-аутом, он приходит в плохое состояние и плохо себя ведет (проблема многопоточности). Я следовал советам, найденным здесь:

https://github.com/watir/watir-webdriver/issues/137

Я реализовал активное уничтожение (вместо browser.close) и перезапуск Watir::Browser после спасения любого исключения.

0 голосов
/ 14 июля 2014

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

require 'watir-webdriver'

client = Selenium::WebDriver::Remote::Http::Default.new
client.timeout = 5
@browser = Watir::Browser.new :firefox, :http_client => client

@browser.goto "twitter.com"

#after the page loads, log in 
def test    
  begin
     temp = []
     temp = @browser.cookies.to_a
     @browser.goto "twitter.com:81"
  rescue => e
     puts "Browser timed out"
     @browser.close
     @browser = Watir::Browser.start "twitter.com"

     temp.each do |me|
       @browser.cookies.add(me[:name], me[:value])
     end
     @browser.refresh 

  end
end

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

...