Я подправил ответ @ 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
ОБНОВЛЕНИЕ Недавно я понял, что могу получить полный html-элемент, используя собственный javascript (d'oh!).Вы должны использовать хак, чтобы получить "externalHTML".Вот мой новый метод:
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