click_no_wait не работает во второй раз, когда AutoIt используется для обработки окна загрузки файла

#ruby #watir #autoit

#ruby #watir #autoit

Вопрос:

Я сталкиваюсь с проблемой, когда я вызываю метод click_no_wait для элемента управления, который отображает окно «Загрузка файла». В первый раз все работает нормально. я использую Auto It для обработки окна загрузки файла и сохранения файла в определенном месте. Теперь, когда я пытаюсь использовать click_no_wait для того же элемента управления, он не отображает окно загрузки файла, но если я обновлю браузер перед вызовом click_no_wait, он отобразит окно загрузки файла. Итак, мой вопрос заключается в том, что Auto It не выпускается и, следовательно, click_no_wait не может найти элемент управления или что-то не так с реализацией метода click_no_wait.

Окружающая среда: ОС: Microsoft XP SP2 Ruby: ruby 1.8.6 patchelevel 398 Watir: 1.8.1

Ниже приведен способ использования элемента управления

 def click_export_button 
  control = browser.button(:id,'export-button') 
  $DEBUG = true 
  #browser.refresh         #- If this line is not commented, the dialog appears 
  control.click_no_wait    #-- I replace click_no_wait with click and/or click! and the code freezes, so the control is found 
  download_file("C:\test.csv") 
  $DEBUG = false 
end 
  

Вот код для загрузки файла

 def download_file(filePath = nil) 
  autoIt = WIN32OLE.new("AutoItX3.Control") 
  timeout = 10 
  fileDownloadWindowTitle = "File Download" 
  handle = autoIt.WinWait(fileDownloadWindowTitle, "Do you want to open or save this file?", timeout) 
  retVal = nil 
  unless (handle.eql? @autoItError) 
    autoIt.WinActivate(fileDownloadWindowTitle) 
    autoIt.ControlClick(fileDownloadWindowTitle, "", "amp;Save") 
    saveWindowTitle = "Save As" 
    windowHandle = autoIt.WinWaitActive(saveWindowTitle, "", timeout) 
    if (windowHandle == 1) 
      retVal = save_file(saveWindowTitle, autoIt, filePath) #-- function to save the file to the location 
    end 
  else 
    puts "Unable to download the file" 
  end 
  autoIt.ole_free 
  return retVal 
end 
  

Вот ошибка, которую я получаю

 ruby -e "$:.unshift('c:/ruby/lib/ruby/gems/1.8/gems/watir-1.8.1/lib/ 
watir/win32ole').unshift('c:/ruby/lib/ruby/gems/1.8/gems/ 
commonwatir-1.8.1/lib').unshift('c:/ruby/lib/ruby/gems/1.8/gems/ 
firewatir-1.8.1/lib').unshift('c:/ruby/lib/ruby/gems/1.8/gems/ 
watir-1.8.1/lib');require 'c:/ruby/lib/ruby/gems/1.8/gems/watir-1.8.1/ 
lib/watir/core';Watir::Button.new(Watir::IE.attach(:hwnd, 
6751822), :unique_number, 3).click!();" 
c:/ruby/lib/ruby/gems/1.8/gems/watir-1.8.1/lib/watir/element.rb:58:in 
`assert_exists': Unable to locate element, using :unique_number, 3 
(Watir::Exception::UnknownObjectException) 
        from c:/ruby/lib/ruby/gems/1.8/gems/watir-1.8.1/lib/watir/ 
element.rb:275:in `click!' 
        from -e:1 
  

Любая помощь будет оценена.
Заранее спасибо

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

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

2. Похоже, что потенциально это может быть проблема с нажатием самой кнопки загрузки, а не с автозапуском. Что-то изменяет html на вашей странице между первой и второй попытками загрузить файл? Может объяснить, почему это решается с помощью обновления. Идентификатор на кнопке определенно одинаковый до и после нажатия, да?

3. Да, но некоторые элементы обновляются с помощью AJAX, например, div скрывается или становится видимым. Есть ли проблема с click_no_wait, который не может видеть элемент управления

4. Я не совсем уверен. Если это работает как Watir-Webdriver, если вы сохраняете элементы в переменных для последующего использования, они станут недействительными, если html на странице значительно изменится. Поскольку ваш метод нажатия кнопки определяет элемент внутри него каждый раз (control = browser.button(:id,’export-button’)), я действительно не вижу в этом проблемы. Но на всякий случай попробуйте изменить свой код, чтобы он всегда ссылался на кнопку, которую нажимает код watir напрямую, а не в переменной (т. е. Всегда browser.button(:id,’export-button’).click_no_wait

5. Я попробовал ваше предложение, оно все равно не сработало. Что ж, предполагая, что вы сделали предложение, по-прежнему не имеет никакого смысла, что метод click находит его, но click_no_wait не может его найти. Я думаю, что в функциональности click_no_wait может быть что-то не так, поскольку я также перевожу режим ожидания перед вызовом click_no_wait

Ответ №1:

Вы можете попробовать добавить следующее перед вашим click_no_wait:

 "browser.refresh"