对于一个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"]