Ruby Webdriver。从页面中的元素中获取所有'data'值



对于一个html网站。我需要获取具有相同类的元素的所有"数据"属性值。这些元素具有具有不同"数据"值的所有相同类。

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

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

我尝试了几种方法都没有成功:-首先,我尝试像往常一样获取"数据"值 href 和标题属性:

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"

提前谢谢你!

获取具有相同类的所有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-*"元素的值。我认为这需要更多的步法。

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"]

最新更新