获取Webdriver中元素的所有属性或xPath

时间:2011-12-13 06:48:28

标签: ruby selenium element webdriver

我正在尝试为我的网页进行简单的猴子测试,它会在页面上获取所有活动元素并以随机顺序点击它们。

当我这样做时,我想写一个日志来了解,我的测试点击哪个元素以及哪个测试崩溃了

所以我希望日志文件看起来像这样

01.01.11 11.01.01 Clicked on Element <span id='myspan' class ='myclass .....>
01.01.11 11.01.01 Clicked on Element <span id='button' class ='myclass title = 'Button'.....>

01.01.11 11.01.01 Clicked on Element //*[@id='myspan']
01.01.11 11.01.01 Clicked on Element //*[@id='button']

在Webdriver + Ruby中有什么办法吗?

4 个答案:

答案 0 :(得分:1)

我认为没有办法,但你可以做这样的事情(使用watir-webdriver):

browser.divs.each do |div|
    puts '<span ' + ['id','class','title'].map{|x| "#{x}='#{div.attribute_value(x)}'"}.join(' ') + '>'
end

答案 1 :(得分:1)

WebDriver不提供此类功能,您必须获取页面源并进行一些自己的解析 - 我在使用C#的Html Agility Pack中完成此操作,您需要为ruby找到类似的库(见:Options for HTML scraping?

答案 2 :(得分:1)

你可以这样做:

  1. 获取可点击的所有元素 例如,找到所有链接,找到所有可点击的跨度。将这些候选人列入名单

  2. 随机选择该候选列表中的元素

  3. 单击元素并编写一些日志

答案 3 :(得分:1)

我调整了@ pguardiario的回答来提出这个方法:

def get_element_dom_info(@e)
  if @e.class != Selenium::WebDriver::Element
    raise "No valid element passed: #{@e.class}"
  end
  @attrs = ['id', 'class', 'title', 'href', 'src', 'type', 'name']
  return "<" + @e.tag_name + @attrs.map{ |x| " #{x}='#{@e.attribute(x)}'" if @e.attribute(x) && @e.attribute(x) != "" }.join('') + ">"
end

当然,它希望传递给它的单个参数是一个实际的Selenium元素。此外,它不包含所有可能的属性,但这是其中的大多数(如果需要,您可以随时添加额外的属性)。

我想你可以通过这样的代码集成它:

def clickElement(*args)
  ... # parse vars
  @e = @driver.find_element(...)
  puts get_timestamp + "  Clicked on Element: " + get_element_dom_info(@e)
end

<强>更新 我最近意识到我可以使用原生的javascript(d'oh!)获得元素的完整html。你必须使用hack来获得“outerHTML”。这是我的新方法:

def get_element_dom_info(how, what)
  e = @driver.find_element(how, what)

  # Use native javascript to return element dom info by creating a wrapper 
  # that the element node is cloned to and we check the innerHTML of the parent wrapper.
  return @driver.execute_script("var f = document.createElement('div').appendChild(arguments[0].cloneNode(true)); return f.parentNode.innerHTML", e)

end