Получить все атрибуты или xPath элемента в Webdriver - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь сделать простой тест на обезьяну для своей веб-страницы, который получает все активные элементы на странице и нажимает на них в случайном порядке.

Когда я делаю это, я хочу написать журнал, чтобы знать, на каком элементе мой тестовый клик и на каком тесте произошел сбой

Поэтому я хочу, чтобы файл журнала выглядел следующим образом

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 ]

1 голос
/ 17 марта 2012

Я подправил ответ @ 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
1 голос
/ 13 декабря 2011

WebDriver не предоставляет такой функциональности, вам нужно было бы получить исходный код страницы и выполнить собственный анализ - я сделал это в Html Agility Pack с C #, вам нужно будет найти подобную библиотеку для ruby (см .: Параметры для очистки HTML? )

1 голос
/ 14 декабря 2011

Вы можете сделать это:

  1. Получить все элементы, которые можно нажимать. Например, найти все ссылки, найти все кликабельные промежутки.Поместите этих кандидатов в список

  2. Случайным образом выберите элемент в этом списке кандидатов

  3. Щелкните по самому элементу и напишите какой-нибудь журнал

1 голос
/ 13 декабря 2011

Я не думаю, что есть способ, но вы всегда можете сделать что-то вроде этого (с помощью watir-webdriver):

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