2016-01-20 108 views
0

对于一个html网站。我需要获取具有相同类的元素的所有“数据”属性值。这些元素具有不同“数据”值的同一类。Ruby Webdriver。从页面中的元素获取所有'数据'值

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" 

预先感谢您!

回答

0

了大量的研究,以及电子书阅读后,我找到了解决办法:

这里有一系列例子:

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

获得具有同一类别的所有网页元素的数据,以下是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")); 
    } 

谢谢你, 穆拉利

0

会有帮助有一些HTML来测试这个,但我会采取一个破解它。首先,我假设你只是在寻找“数据通道”属性的值的值,而不是其他的“数据 - *”元素。这需要我想多一点脚步。

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

可悲的是,我们不使用的Watir,所以即时得到的错误“未定义的方法'attribute_value'为#” –