#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"