PHP的shell_exec不允许执行“Watir :: Browser.new:firefox”

时间:2011-08-31 23:15:25

标签: php ubuntu watir watir-webdriver

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

我有一个MySQL数据库,其中包含我需要的测试数据。我已经做了很多在过去的这个数据,所以我有PHP工具全库/访问这些数据,标记数据,在使用使用/坏的/ etc,一般我有很多的时间投入PHP框架。所以,我真的很喜欢使用PHP框架周围的Watir脚本的包装 - 例如,使用PHP从数据库中抓取测试用户登录数据,并将其传递到处理的Ruby脚本

我现在拥有需要工作/测试的PHP网站以及PHP& cURL无法解决这个问题。因此,我正在使用Watir-WebDriver在Ubuntu 10.10(Maverick,桌面而非服务器)上为这些网站。我遇到的问题是使用PHP的ruby脚本的shell_exec和所有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文件权限似乎不是问题。从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运行良好),但我真的想用WatirWebDriver代替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 个答案:

答案 0 :(得分: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/

答案 1 :(得分:2)

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

您可以执行sudo www并尝试使用rb运行脚本,以查看与服务器用户一起运行ruby时是否存在问题。

答案 2 :(得分:2)

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

ini_set("display_errors",1); 
error_reporting(E_ALL);

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

我从未弄明白这一点。无头不是让PHP执行脚本的答案。我很确定这是Firefox可执行文件的权限问题,但在找到实际修复程序之前我不能肯定。

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

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

感谢您的帮助