Не удается сфокусировать новое окно в Ruby Watir

#ruby #selenium-webdriver #watir-webdriver

#ruby #selenium-webdriver #watir-webdriver

Вопрос:

Я провел много исследований, прежде чем задавать эти вопросы, но не смог найти ответ.

Я пытаюсь автоматизировать веб-сайт, используя Ruby Selenium Webdriver. У меня возникла проблема с зависанием скрипта после открытия нового окна. Я не могу сосредоточиться на новом окне или сделать что-либо еще.

Вот код, который открывает новое окно:

 <a id="theField" class="RightTextHeading" onclick="javascript:openTheWindow('someInfo.aspx?type=','300','300');if(window.document.RetValue == '5'){window.parent.LoadinIframe('someStuff.aspx?info=Namp;amp;Stuff=','Some Data here > Full View','false');}; return false;" href="../MoreStuff/#" style="text-decoration: none;">ClickMe <span class="context"> opens an overlay</span></a>
  

Вот мой код ruby:

     require 'rubygems'
require 'watir-webdriver'
require 'selenium-webdriver'

prefs = {
  :download => {
    :prompt_for_download => false,
    :default_directory => '.'
  }
}
client = Selenium::WebDriver::Remote::Http::Default.new
#client.timeout = 600 # seconds - default is 60
client.timeout = 30 # seconds - default is 60
d = Selenium::WebDriver.for :chrome, :prefs => prefs, :http_client => client
b = Watir::Browser.new d

saved_cookies = b.cookies.to_a

b.goto'https://somewebsite.com'
begin
    b.iframe(:id => 'iframeBody').a(:id => "somelink").click
rescue
    puts 'Rescue'
end
sleep 2
puts "before"
#if b.window(:title=>"The new window").exists?
   #puts " Test passed. New window opened!"
#else
   #puts " Test Failed! No window found"
#end
#b.window(:title => /The new window/).use do
#b.window.last.use do
#   puts "here" 
#end
#puts b.window(:title => "The new window").exists?
puts b.windows.size
puts "after"

#b.close
  

Я прокомментировал разные вещи, которые я пытался заставить это работать.
Кажется, что Ruby просто сидит и ждет после открытия нового окна, и я не знаю, как вывести его из состояния ожидания.

Если я не запускаю / не спасаю, код останавливает выполнение до истечения времени ожидания. Когда я пытаюсь выполнить спасение, я могу вернуть управление, но все еще не могу сфокусироваться на новом окне.

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

Спасибо, -Андрей

Комментарии:

1. Необходимость запуска восстановления при нажатии на ссылку кажется странной. Вы хотите сказать, что время ожидания при нажатии на ссылку истекло или вы пытаетесь найти новое окно? Это помогло бы выдать результат (т. Е. исключения) каждой из разных вещей, которые вы пробовали.

2. После этой строки: b.iframe(:id => ‘iframeBody’).a(:id => «somelink»).нажмите, откроется новое окно, но Ruby остановится. Даже обычный ввод «здесь» ничего не делает.

3. «Останавливается» — что это значит? Выдает ошибку или находится в явно бесконечном цикле? Или что-то еще?

4. Он открывает новое окно, затем останавливается примерно на 30 секунд и после этого выдает мне ошибку: / usr/share/ruby/net/protocol.rb:158:в `rescue in rbuf_fill’: Net::ReadTimeout (Сеть::ReadTimeout)

5. Используете ли вы последнюю версию selenium-webdriver и самый последний драйвер браузера? Результаты поиска, которые я вижу с тем же исключением, похоже, были устранены путем обновления до последней версии.

Ответ №1:

Я не совсем уверен, что вы пытаетесь сделать с тестом, но ответ о том, как что-то сделать с новым окном, в некоторой степени уже есть в вашем коде

 #b.window.last.use do
  

должно быть

 #b.windows.last.use 
  

или

 @browser.windows.last.use
  

Ваш тест начнется с использованием нового окна, как только оно появится.

В зависимости от того, что вы пытаетесь сделать, может измениться, куда в вашем коде должна идти эта строка. Но это позволит вам получить доступ к новому окну и взаимодействовать с ним.

Комментарии:

1. Почему должно b.window.last.use do быть b.windows.last.use ? use принимает блок, который позволяет использовать другое окно, а затем автоматически переключаться обратно в исходное окно.

2. Я пробовал с b.windows.last.use, и я все еще получаю ту же проблему. Код, который я опубликовал выше, работает на моем фиктивном веб-сайте, который просто открывает новое окно. Я думаю, проблема в том, что функция javascript ожидает возврата из нового окна, а Ruby сидит и ждет этого.

3. как я писал выше: после этой строки: b.iframe(:id => ‘iframeBody’).a(:id => «somelink»).нажмите, откроется новое окно, но Ruby остановится. Даже обычный ввод «здесь» ничего не делает

4. @Justin Казалось, что у него возникли проблемы с выполнением чего-либо с новым окном, поэтому я пытался предложить способ доступа к нему. Вопрос был неясен относительно того, что на самом деле должно было произойти в новом окне или в чем конкретно заключалась ошибка. Я преклоняюсь перед вашим опытом, я просто пытался предложить способ доступа к его новому окну, поскольку именно это, как я понял из вопроса, и было проблемой.