Ruby 网络驱动程序。从页面中的元素获取所有 'data' 值

Ruby Webdriver. Get all 'data' values from elements in page

一个 html 站点。我需要获取具有相同 class 的元素的所有 "data" 属性值。这些元素都具有相同的 class 和不同的 "data" 值。

div class="logo" data-channel="1"

其中 data-channel="N" 是我需要的值,因此我可以构建一个不同的 URL 来导航到它。

我尝试了几种方法都没有成功: - 首先,我尝试获取 "data" 值,就像我对 href 和 title 属性所做的那样:

filtros = @driver.find_elements(:class, "logo")
channels_data = []
filtros.each {|f|
    channels_data += [ f[:data] ]
}
channels_data.each {|f|
    puts "data: " + f
}

但是我得到以下错误:

Failures:

  1) itv_personalvideo Should test the channels
     Failure/Error: puts "data: " + f
     TypeError:
       no implicit conversion of nil into String
     # ./spec/2.2/_web_itv_pc_personalvideo.rb:149:in `+'
     # ./spec/2.2/_web_itv_pc_personalvideo.rb:149:in `block (3 levels) in <top (required)>'
     # ./spec/2.2/_web_itv_pc_personalvideo.rb:148:in `each'
     # ./spec/2.2/_web_itv_pc_personalvideo.rb:148:in `block (2 levels) in <top (required)>'

-其次我直接尝试了 运行 javascript 代码,就像我在其他测试用例中已经拥有的那样:

js_element = @driver.execute_script("document.querySelectorAll('.logo')[13].dataset.channel;")
puts js_element

但是我还有一个错误:

Failures:

  1) itv_personalvideo Should test the channels
     Failure/Error: js_element = @driver.execute_script("document.querySelectorAll('.logo')[13].dataset.channel;")
     Selenium::WebDriver::Error::UnknownError:
       unknown error: Cannot read property 'dataset' of undefined
         (Session info: chrome=47.0.2526.111)
         (Driver info: chromedriver=2.20.353124 (035346203162d32c80f1dce587c8154a1efa0c3b),platform=Linux 3.16.0-4-amd64 x86_64)
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/remote/response.rb:71:in `assert_ok'
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/remote/response.rb:34:in `initialize'
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/remote/http/common.rb:78:in `new'
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/remote/http/common.rb:78:in `create_response'
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/remote/http/default.rb:90:in `request'
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/remote/http/common.rb:59:in `call'
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/remote/bridge.rb:657:in `raw_execute'
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/remote/bridge.rb:635:in `execute'
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/remote/bridge.rb:360:in `executeScript'
     # /home/usuario/.rvm/gems/ruby-2.2.1/gems/selenium-webdriver-2.47.1/lib/selenium/webdriver/common/driver.rb:212:in `execute_script'
     # ./spec/2.2/_web_itv_pc_personalvideo.rb:123:in `block (2 levels) in <top (required)>'

这让我很惊讶,因为在浏览器中,Javascript 代码给了我需要的数字:

> document.querySelectorAll('.logo')[13].dataset.channel;
"16"

提前致谢!

获取所有具有相同class的web元素的数据,下面是Java中的脚本,希望它能帮助你在Ruby

中构建
//collect all the web elements having the class logo
    List<WebElement> data=driver.findElements(By.className("logo"));

    //to get data-channel of each element
    for(int i=0; i<data.size(); i++){

        //printing the data-channel value
        System.out.println(data.get(i).getAttribute("data-channel"));
    }

谢谢, 穆拉利

有一些 html 来测试它会很有帮助,但我会尝试一下。首先,我假设您只查找 "data-channel" 属性的值,而不是其他 "data-*" 元素的值。我认为这需要更多的步法。

require 'watir-webdriver'
b = Watir::Browser.new
#...
b.divs(:class => "logo").each do |div|
  puts div.attribute_value("data-channel")
end

经过大量研究和阅读书籍,我找到了解决方案:

下面是示例列表:

driver.find_element(:link_text, "element")["href"])
driver.find_element(:link_text, "element")["id"])
driver.find_element(:id, "element").text
driver.find_element(:id, "element").tag_name
driver.find_element(:id, "element").attribute("data-id")
driver.find_element(:id, "element")["style"]