我正在尝试为我的网页进行简单的猴子测试,它会在页面上获取所有活动元素并以随机顺序点击它们。
当我这样做时,我想写一个日志来了解,我的测试点击哪个元素以及哪个测试崩溃了
所以我希望日志文件看起来像这样
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中有什么办法吗?
答案 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)
你可以这样做:
获取可点击的所有元素 例如,找到所有链接,找到所有可点击的跨度。将这些候选人列入名单
随机选择该候选列表中的元素
单击元素并编写一些日志
答案 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