PHP shell_exec не позволяет выполнять «Watir :: Browser.new: firefox» - PullRequest
1 голос
/ 01 сентября 2011

Я новичок в ruby ​​и Watir, вот моя проблема ...

У меня есть MySQL DB с тестовыми данными, которые мне нужны.В прошлом я много сделал с этими данными, и поэтому у меня есть целая библиотека PHP-инструментов для доступа к этим данным, пометки данных как используемых / используемых / плохих / и т. Д., И в целом я потратил много времени нафреймворк PHP.Поэтому мне бы очень хотелось использовать среду PHP в качестве оболочки для сценария Watir - например, использовать PHP для получения тестовых данных для входа пользователя из БД и передачи их в сценарий ruby ​​для обработки.

Iтеперь есть сайты с javascript, которые требуют работы / тестирования, и PHP & cURL не может справиться с этим.Поэтому я работаю с Watir-WebDriver в Ubuntu 10.10 (Maverick, Desktop не Server) для этих сайтов.У меня проблема с использованием PHP shell_exec сценария ruby ​​со всем кодом Watir.

PHP shell_exec выполняет файл - я вижу это, потому что у меня есть некоторые строки в файлекоторые отображаются.Тем не менее код выглядит как сбой в строке

ff = Watir::Browser.new :firefox

Я не получаю сообщение об ошибке от PHP.

Строка PHP:

echo shell_exec('ruby /var/www/watir_test.rb');

Скрипт ruby ​​прекрасно работает, когда я вызываю его из окна терминала со строкой:

ruby /var/www/watir_test.rb

Я изначально ожидал, что это проблема с разрешениями, поскольку он работал из командной строки, а не из браузера.Однако, поскольку он может достаточно хорошо вызывать файл для возврата жестко закодированных данных, которые я предоставил для теста, разрешения для файла ruby, похоже, не являются проблемой.Может ли быть проблема с разрешениями при открытии окна Firefox от пользователя www-data?

Когда я запускаю

ruby -d -v /var/www/watir_test.rb

, я получаю:

{:extension=>:webdriver} {"app.update.enabled"=>"false"} {"browser.link.open_newwindow"=>"2"} {"browser.shell.checkDefaultBrowser"=>"false"} {"extensions.update.enabled"=>"false"} {"security.warn_entering_secure.show_once"=>"false"} {"webdriver_assume_untrusted_issuer"=>true} {"startup.homepage_welcome_url"=>"\"about:blank\""} {"browser.tabs.warnOnClose"=>"false"} {"extensions.update.notifyUser"=>"false"} {"toolkit.networkmanager.disable"=>"true"} {"security.warn_entering_weak.show_once"=>"false"} {"webdriver_firefox_port"=>"7055"} {"browser.download.manager.showWhenStarting"=>"false"} {"extensions.logging.enabled"=>"true"} {"network.manage-offline-status"=>"false"} {"network.http.max-connections-per-server"=>"10"} {"security.warn_submit_insecure"=>"false"} {"security.warn_entering_weak"=>"false"} {"security.warn_leaving_secure"=>"false"} {"prompts.tab_modal.enabled"=>"false"} {"security.warn_viewing_mixed.show_once"=>"false"} {"dom.max_script_run_time"=>"30"} {"webdriver_accept_untrusted_certs"=>true} {"browser.safebrowsing.enabled"=>"false"} {"security.warn_leaving_secure.show_once"=>"false"} {"signon.rememberSignons"=>"false"} {"javascript.options.showInConsole"=>"true"} {"app.update.auto"=>"false"} {"browser.EULA.3.accepted"=>"true"} {"browser.tabs.warnOnOpen"=>"false"} {"dom.disable_open_during_load"=>"false"} {"network.http.phishy-userpass-length"=>"255"} {"security.warn_entering_secure"=>"false"} {"browser.startup.homepage"=>"\"about:blank\""} {"browser.EULA.override"=>"true"} {"browser.dom.window.dump.enabled"=>"true"} {"browser.startup.page"=>"0"} {"browser.link.open_external"=>"2"} {"browser.search.update"=>"false"} {"browser.sessionstore.resume_from_crash"=>"false"} {"security.warn_viewing_mixed"=>"false"} {"dom.report_all_js_exceptions"=>"true"} {"webdriver_enable_native_events"=>false} {"devtools.errorconsole.enabled"=>"true"}

Как сделатьЯ получаю PHP для правильного выполнения shell_exec?Сценарий работает, и мои первоначальные тесты были запущены с использованием firewatir (который shell_exec работал нормально), но я действительно хочу использовать Watir-WebDriver вместо FireWatir - WatirWebDriver должен поддерживать браузер Chrome (и IE на компьютере с Windows), а FireWatirмогу запускать только Firefox.

Спасибо, Гейб

Вот мой код "Создать браузер":

# Include the RubyGems file
require 'rubygems'

# Include the Watir-WebDriver file. 
require 'watir-webdriver'


# Create the necessary objects
def create_browser(proxy)
    # Setup the proper Firefox Profile
    profile = Selenium::WebDriver::Firefox::Profile.new
    profile.proxy = Selenium::WebDriver::Proxy.new :http => proxy

    puts "<br>Using proxy " + proxy + "..."


    #ff=FireWatir::Firefox.new :profile => profile
    ff = Watir::Browser.new :firefox #, :profile => profile

    puts "<br>Firefox ready..."

    return ff
end

Ответы [ 5 ]

3 голосов
/ 01 сентября 2011

Если сервер безголовый, вы должны установить гем безголовый, чтобы Firefox мог работать.

require 'watir-webdriver'
require 'headless'
headless = Headless.new
headless.start
b = Watir::Browser.start 'www.google.com'
puts b.title
b.close
headless.destroy

См .: http://watirwebdriver.com/headless/

2 голосов
/ 16 ноября 2011

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

ini_set("display_errors",1); 
error_reporting(E_ALL);
2 голосов
/ 01 сентября 2011

Это не проблема с разрешениями, PHP-скрипт запускается с разрешениями сервера, обычно apache.

Вы можете выполнить sudo www и попытаться запустить сценарий с помощью rb, чтобы увидеть, есть ли проблема при запуске ruby ​​с пользователем сервера.

1 голос
/ 18 мая 2012

Так что недавнее обновление Firefox убило его поддержку Watir (без JSSH, если я помню). В результате я переписал маленький код для Selenium :: WebDriver. Но я думаю, что это не особенно актуально (если оно уместно, я его не знаю).

Моим конечным решением было использование phpseclib. Это позволяет мне подключаться к машине через SSH2 класс PHP. Когда я вошел в систему под своим типичным именем пользователя (с типичным паролем), я смог без проблем запустить безголовую версию моего скрипта. Единственные реальные проблемы, которые это создает, - это то, что мне теперь приходится просматривать все, что происходит, через файлы журналов и снимки экрана, но это, вероятно, будет правдой, независимо от того, какое решение я придумала.

phpseclib нужны ваши имя пользователя и пароль для сервера (по крайней мере, до тех пор, пока вы не зададите какую-либо форму открытого открытого ключа). Поэтому я не хотел бы делать это на общедоступной машине без пары уровней безопасности - например, установка .htaccess для запрета доступа для чтения к файлу с данными для входа, шифрование пароля, хранящегося в файле, и т. Д. Однако, для моих целей я вхожу в одну машину в моей локальной сети с другой машины в моей локальной сети. Пароль действителен только для моей локальной сети (но не для веб-серверов), и хотя моя локальная сеть может его увидеть, он не должен быть (легко) доступен для остального мира (насколько мне известно). Таким образом, проблемы безопасности минимальны.

0 голосов
/ 16 сентября 2011

Я так и не понял этого.Безголовый не является ответом на то, чтобы заставить PHP выполнить скрипт.Я почти уверен, что это проблема с правами доступа к исполняемому файлу Firefox, но я не могу быть уверен, пока не найду реальное исправление.

В конечном счете мне пришлось разбить инструмент, где PHP управляет БД и задачейпланирования.Затем PHP создает текстовые файлы со всеми данными, необходимыми для ruby, чтобы запустить браузер на нужном сайте, войти в систему и т. Д., И т. Д. Затем ruby ​​перемещает файл данных в одну из нескольких разных папок (успех, сбой, неудачный вход в систему и т. Д.).) и добавляет текст в файл данных.Наконец, PHP анализирует всю эту информацию в перемещенных текстовых файлах и обновляет БД, используя эту информацию.

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

Спасибо за помощь

...