1

我正在尝试使用 Capybara-webkit 在无头模式下运行一个简单的谷歌搜索测试。

我已将驱动程序设置为 env.rb 文件:

Capybara.default_driver = :webkit
Capybara.current_driver = :webkit
Capybara.javascript_driver = :webkit

特征文件有一个简单的场景大纲,用于搜索输入并验证结果是否包含预期的输出:

    Given User opens the google page
    When she searches for "<input>"
    Then verify that the result has "<output>"

    Examples:
    |input                    | output           |
    |Agile Samurai author name|Jonathan Rasmusson|
    |Eloquent Ruby author name|Russ Olsen        |

在步骤定义中,访问google页面并在文本框中输入输入并单击搜索按钮。

Given /^User opens the google page$/ do
  visit "http://google.com"
end

When /^she searches for "(.*?)"$/ do |search_query|
        fill_in "gbqfq", :with => search_query
        click_button "gbqfba"
end

Then /^verify that the result has "(.*?)"$/ do |output|
        should have_content output
end

当我运行这些测试时,我得到了错误:

找不到字段“gbqfq”(Capybara::ElementNotFound)

但是,如果我将驱动程序更改为硒:

Capybara.default_driver = :selenium
Capybara.current_driver = :selenium
Capybara.javascript_driver = :selenium

然后,测试运行并且所有步骤都通过。

在无头模式下,是否以其他方式找到元素?我的方法错了吗?我无法理解为什么在浏览器模式(打开 firefox 实例)下工作正常时,在无头模式下找不到该元素。

我是这个领域的新手,所以任何帮助都将不胜感激。先感谢您。

4

2 回答 2

2

我使用puts page.html. 我发现无头模式的源代码不同。

这是浏览器模式下文本框源代码的一部分:

<input id="gbqfq" class="gbqfif" type="text" value="" autocomplete="off" name="q">

这是headless模式下的部分文本框源代码:

<input class="lst" spellcheck="false" dir="ltr" title="Google Search" value="">

由于headless模式源码中不存在id,所以测试失败。如果有一些在两种模式中通用的名称,则将其用于测试。

我不确定为什么会这样。但谷歌可能会根据有头或无头模式加载不同的页面。

我尝试了一些其他网站,例如 Flipkart.com,它们在这两种模式下都可以使用。即 id 等在两种模式下都是相同的。

因此,问题中的代码没有任何问题。只需要使用两种模式中都存在的 id。

于 2013-01-03T09:23:46.770 回答
0

您的click_button线路似乎有错误id的按钮。

它应该是:

click_button "gbqfba"

所以你的行变成:

fill_in "gbqfq", :with => search_query
click_button "gbqfba"

我不确定这是否会有所帮助,但值得一试。

于 2013-01-02T06:09:02.783 回答