1

我是 ruby​​ 和 Watir 的新手,这是我的问题......

我有一个 MySQL 数据库,里面有我需要的测试数据。过去我对这些数据做了很多工作,所以我有一个完整的 PHP 工具库来访问这些数据,将数据标记为使用/使用/坏/等,总的来说,我有很多时间投入到PHP 框架。所以我真的很想使用 PHP 框架作为 Watir 脚本的包装器——例如,使用 PHP 从数据库中获取测试用户登录数据并将其传递给 ruby​​ 脚本进行处理。

我现在有需要工作/测试的带有 javascript 的网站,而 PHP 和 cURL 无法处理这个问题。因此,我正在为这些站点在 Ubuntu 10.10(Maverick,桌面而非服务器)上使用 Watir-WebDriver。我遇到的问题是在所有 Watir 代码中使用 PHP 的 shell_exec 的 ruby​​ 脚本。

PHP shell_exec 正在执行该文件 - 我可以看到它,因为我在文件中有一些正在显示的 puts 行。但是,代码似乎在线失败

ff = Watir::Browser.new :firefox

我没有从 PHP 中得到错误。

PHP 行是:

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

当我从终端窗口调用它时,ruby 脚本工作正常:

ruby /var/www/watir_test.rb

我最初预计这是一个权限问题,因为它是从命令行而不是从浏览器中工作的。但是,由于它可以很好地调用文件以返回我为测试提供的硬编码数据,因此 ruby​​ 文件权限似乎不是问题。从 www-data 用户打开 Firefox 窗口是否存在权限问题?

当我跑

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 浏览器(和 Windows 机器上的 IE),而 FireWatir只能运行火狐。

谢谢加布

这是我的“创建浏览器”代码:

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

5 回答 5

3

如果服务器是无头的,您应该安装无头 gem 以便 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/

于 2011-09-01T04:33:16.573 回答
2

这不是权限问题,PHP 脚本以服务器的权限运行,通常是 apache。

您可以执行 asudo www并尝试运行脚本,然后rb查看使用服务器用户运行 ruby​​ 时是否存在问题。

于 2011-08-31T23:18:18.990 回答
2

将下面的两行代码放在 PHP 脚本的最顶部。这样做的结果是,当您使用浏览器浏览 PHP 页面时,它将准确显示错误是什么,包括任何权限错误。

ini_set("display_errors",1); 
error_reporting(E_ALL);
于 2011-11-15T22:44:11.717 回答
1

所以最近对 Firefox 的更新杀死了它对 Watir 的支持(如果我记得的话,没有 JSSH 更新)。结果,我重写了我为 Selenium::WebDriver 编写的小代码。但我认为这并不是特别相关(如果它是相关的,我不知道它包括在内)。

我的最终解决方案是使用 phpseclib。这允许我通过他们的 SSH2 PHP 类 SSH 进入机器。以我的典型用户名(使用典型密码)登录后,我就可以启动我的脚本的无头版本,没问题。这造成的唯一真正问题是我现在必须通过日志文件和屏幕截图查看正在发生的所有事情,但无论我想出什么解决方案,这都可能是真的。

phpseclib 需要您的服务器用户名和密码(至少在您设置某种形式的公共私钥对之前)。所以我不想在没有几层安全性的公共机器上执行此操作 - 例如设置 .htaccess 以拒绝对包含登录数据的文件的读取访问,加密存储在文件中的密码等。但是,出于我的目的,我正在从 LAN 上的另一台机器登录 LAN 上的一台机器。密码只在我的局域网(而不是我的网络服务器)上有效,虽然我的局域网可以看到它(据我所知)不应该(很容易)提供给世界其他地方。所以安全问题是最小的。

于 2012-05-17T23:30:54.300 回答
0

我从来没有弄清楚这一点。Headless 不是让 PHP 执行脚本的答案。我很确定这是 Firefox 可执行文件的权限问题,但在找到实际修复之前我不能肯定。

最终,我不得不分解 PHP 管理数据库和任务调度的工具。然后 PHP 创建文本文件,其中包含 ruby​​ 运行浏览器到正确站点、登录等所需的所有数据...然后 ruby​​ 将数据文件移动到几个不同文件夹之一(成功、失败、登录错误等) ) 并向数据文件添加一些文本。最后,PHP 解析移动的文本文件中的所有这些信息,并使用该信息更新数据库。

它不太理想,但它正在完成工作。现在我只需要弄清楚如何用多线程运行所有这些......

谢谢您的帮助

于 2011-09-16T15:32:53.773 回答