【问题标题】:Capybara/Poltergeist can't find element by css selectorCapybara/Poltergeist 无法通过 css 选择器找到元素
【发布时间】:2016-08-26 22:39:10
【问题描述】:

当我使用 selenium_webdriver 并显示 firefox 时,工作正常;现在我迁移到无头浏览器,并在我的自动化测试中配置 Poltergeist/PhantomJS,但无法正常工作。 Capybara / Poltergeist 不再找到元素。

我使用 siteprism 映射我的元素,这里是我的示例:element: link, "a[href='\my_link']"

当我的测试运行时,抛出这个错误: Capybara::ElementNotFound: Unable to find css "a[href='/my_link']"

但是当我使用方法find_allcapybara/poltergeist 时找到我的元素:

2016-08-26T19:27:21 [DEBUG] WebPage - evaluateJavaScript "(function() { return (function() { return PoltergeistAgent.stringify((function (name, args) {\n      return __poltergeist.externalCall(name, args);\n    }).apply(this, PoltergeistAgent.JSON.parse(\"[\\\"find\\\",[\\\"css\\\",\\\"a[href='/my_link']\\\"]]\"))) })(); })()"
2016-08-26T19:27:21 [DEBUG] WebPage - evaluateJavaScript result QVariant(QString, "{\"value\":[557]}")
{"command_id":"fc012779-4b24-4659-afba-14180c3aa717","response":{"page_id":1,"ids":[557]}} 
=> []#<Capybara::Result:0x3fd82e69da98>

这是我对 Poltergeist 驱动的配置:

#env.rb

Capybara.default_max_wait_time = 10
    Capybara.register_driver :poltergeist do |app|
    options = {
        :js_errors => true,
        :timeout => 120,
        :debug => true,
        :window_size => [1280, 1024],
        :phantomjs_logger => File.open(FILE_PATH + "test_phantomjs.log", "w+"),
        :phantomjs_options => ['--load-images=no', '--disk-cache=false', '--ignore-ssl-errors=yes', '--debug=true', '--ssl-protocol=TLSv1'],
        :inspector => false,
    }
    Capybara::Poltergeist::Driver.new(app, options)
   end
    Capybara.javascript_driver = :poltergeist
    Capybara.default_driver = :poltergeist
    Capybara.current_driver = :poltergeist 

steps.rb

 Given(/^first step (\w+)$/) do |client_label|
  @client = @client[client_label] ||= get_client(@clients.values.map{|s| s.name})
  @app = App.new
  @app.home.load
end

And(/^step example (\w+)$/) do |var|
  @var = var
  @app.home.action(@var)
end

app.rb

class App
def home
    Home.new
end

def login
    Login.new
end

结束

home.rb

class Home < SitePrism::Page
set_url "https://#{USERNAME}:#{PASSWORD}@#{URL}"

element :link_account,  "a[href='/account']"
element :link_1, "a[href='/link_1']"
element :link_2, "a[href='/link_2']"
element :link_3, "a[href='/link_3']"

##########################################
##########Methods of this page############
##########################################

def action(element)
    element = mapping_elements(element)
    test(element)
end

 def mapping_elements(var)
        case var
        when "option1"
            element = link_1
        when "option2"
            element = link_2
        when "option3"
            element = link_3
        end
    end
end

utils.rb

def test(element)
  click_element(element)
end

def click_element(element)
 element.click
end

我在我的 Poltergeist 注册驱动程序中使用了:inspector =&gt; true,打开 chrome 来查看我的页面;

我使用 chrome 控制台 document.querySelectorAll("a[href='/link_3']") 来选择这个元素。

并返回正确的元素; [<a class=​"foobar" title=​"Title" href=​"/​link_3​">​text​</a>​]

如果有人帮助我,我真的很感激;

谢谢。

【问题讨论】:

  • 你能发布你的测试代码吗?您的页面上有响应式网页设计吗?
  • find_all 的输出实际上显示它正在查找一个元素,但由于其中一个过滤器失败,很可能是可见性,因此没有返回它 - 使用 save_screenshot 查看页面的实际外观,并确保该链接实际上是可见的。要检查的另一件事是您使用的是什么版本的 PhantomJS - 确保它是 2.1.1+
  • @TomWalpole 我使用了 save_screeenshot ,但是当我看到文件时,图像是空白的;我尝试改用 save_page,并在场景失败后显示 html。我看到页面中的元素=/
  • @MichałMłoźniak 我的代码的哪一部分?
  • @user3722709 导致此错误的规范。

标签: html ruby capybara poltergeist site-prism


【解决方案1】:

旧答案,但值得更新

  • 默认情况下,SitePrism 反映了 capybara 仅查找可见元素的逻辑。可以使用 SitePrism 在每个元素的基础上进行配置 (visible: false) 或全局 Capybara.ignore_hidden_elements = false

还考虑到最初的问题,最终想找到 Poltergeist / detro 的替代品 - 现在有无头 chrome/firefox

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 2019-04-30
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多