Testing 使用Capybara webkit时元素未找到错误,但测试在无头模式下运行良好

Testing 使用Capybara webkit时元素未找到错误,但测试在无头模式下运行良好,testing,capybara,capybara-webkit,Testing,Capybara,Capybara Webkit,我正在尝试使用Capybara webkit在无头模式下运行一个简单的google搜索测试 我已将驱动程序设置为env.rb文件中的驱动程序: Capybara.default_driver = :webkit Capybara.current_driver = :webkit Capybara.javascript_driver = :webkit 功能文件有一个简单的场景大纲,用于搜索输入并验证结果是否包含预期输出: Given User opens the google page

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

我已将驱动程序设置为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        |
当我运行这些测试时,会出现以下错误:

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

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

Capybara.default_driver = :selenium
Capybara.current_driver = :selenium
Capybara.javascript_driver = :selenium
然后,运行测试并通过所有步骤

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

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

您的
单击按钮
行似乎有错误的按钮
id

应该是:

click_button "gbqfba"
所以你的台词变成:

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

我不确定这是否有用,但值得一试。

我使用
put page.html
打印了源代码。我发现无头模式的源代码不同

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

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

这是无头模式下文本框源代码的一部分:

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

由于无头模式源代码中不存在id,因此测试失败。 如果在两种模式中都有共同的名称,则在测试中使用该名称

我不知道为什么会这样。但谷歌可能会根据head或headless模式加载不同的页面

我尝试了一些其他网站,比如flipkart.com,它们在两种模式下都能工作。i、 e.两种模式下的id等相同

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

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