【问题标题】:PHP's shell_exec won't allow "Watir::Browser.new :firefox" to executePHP 的 shell_exec 不允许“Watir::Browser.new :firefox”执行
【发布时间】:2011-08-31 23:15:24
【问题描述】:

我是 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 应该能够在 FireWatir 上运行 Chrome 浏览器(和 Windows 机器上的 IE)只能运行 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

【问题讨论】:

  • 对不起,我还想说,当我从 Ubuntu 终端运行它时,会打开一个新的 Firefox 窗口,我可以看到 Watir 登录。当我从浏览器运行 PHP 文件时,不会创建新的 Firefox 窗口 - 而不是当我在 Ubuntu 服务器上或从另一个机器(Win 7)运行它时。
  • 网络用户是否有正在运行的 X?由 www-data 启动的 Firefox 会出现在由 www-data 运行的 X 上。
  • 虽然我对 Ubuntu 相当熟悉,但我不是专家。我对 X 不熟悉。我一直在观察通过 htop 运行的进程——据我所知,在任何用户下都没有运行 Firefox 任务。 htop 正在向我展示 mysql、root、gabe 和 www-data 用户的任务/作业。

标签: php ubuntu watir watir-webdriver


【解决方案1】:

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

【讨论】:

  • 这是 Ubuntu 10.10 桌面而不是服务器(我认为无头意味着没有 GUI、Gnome 等)。正如我所说,当我从终端窗口运行 ruby​​ 脚本时,它按预期端到端工作,而不是当我从 PHP 脚本运行它时。所以问题不在于服务器无法运行 watir-webdriver。在 watir-webdriver 上下文中,headless 到底是什么意思?
  • 通常如果您只有命令行访问权限,那么它会无头运行,即。没有任何显示。
  • 我测试了无头建议 - 没有帮助。再次,我可以从终端的命令行运行 ruby​​ 脚本 - 使用无头部分 - 但不能使用 shell_exec 从 PHP 运行。
【解决方案2】:

不是权限问题,PHP脚本是用服务器的权限运行的,一般是apache。

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

【讨论】:

  • 你把我和 sudo www 搞混了。您的意思是将其添加到 sudoers 中吗?
  • 在另一个线程上,我注意到有人建议这样做:“您可以配置 sudo 以允许 www-data 执行命令,因为 vboxuser 使用 sudo visudo 向 /etc/sudoers 添加一行,例如 www-data (ALL) = (vboxuser) /usr/bin/vboxmanage 检查 man sudoers 了解更多信息"
  • @gabe 忘记sudo,只检查服务器是否有运行rb的权限!
  • 我知道 PHP 可以调用 ruby​​ 脚本。我使用 shell_exec 调用了几个简单的脚本,这些脚本大多只是在屏幕上执行操作——它们完成了。而且,使用 puts,我可以看出它在 Waitr::Browser.new 行上崩溃了。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 感谢您回来查看并提供更新的答案,这对于面临同样问题的其他人来说非常有用。
    【解决方案5】:

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

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

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

    感谢您的帮助

    【讨论】:

      猜你喜欢
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 2018-05-26
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多