7

我对自动化的东西还是很陌生,所以这听起来像是一个愚蠢的问题。在发布问题之前,我确实谷歌搜索了它:)

无论如何,这是问题所在

我在 Android 设备上进行自动化测试其中一项测试是验证一个项目是否已被标记为“收藏”页面的代码片段是:

<li class = "resultItem isFavorite" data-index="2">
<div class="name" data-cis="4ced6feb-3b5c-415a-ae1c-0b8bca8e3c85" onclick="return true">f,f</div>
</li>

我可以在列表中找到元素el = @driver.find_element(:xpath, "//*[class='name' and text() ='f,f']")。我希望 el.class 会告诉我 resultItem isFavorite。相反,我得到的是: Selenium:WebDriver::Element

如果项目未标记为收藏,则不会在字段中添加 isFavorite 标志。我希望使用 isFavorite 来验证一个项目是否被标记为收藏,但我似乎无法将它放入一个变量中。

任何帮助,将不胜感激。

谢谢,

杰夫

4

4 回答 4

12

您真正想要的是以下内容:

# Note: Possibly incorrect Ruby code here. 
# Written from memory.
el = @driver.find_element(:xpath, "/your/xpath/here")
# Could also your el["class"]
element_class_attribute = el.attribute("class")

通常,使用大多数属性名称src(如el.src)会给您一个运行时错误。但是,碰巧class在 Ruby 中具有特殊的含义,每个对象都有一个class属性,即 Ruby 类。

于 2013-01-12T18:53:49.403 回答
3

我在这里读了两个问题。第一,简短,简单。

问:现在我找到el了,如何访问它的 class HTML 属性?

A:使用el.attribute('class'),或者它的简写el['class']。请参阅Selenium::WebDriver::Element.attribute

现在更长的。

问:如何测试由 表示的项目el是否被标记为收藏?

答:见下文。

为了给出更好的答案,我需要更多关于我们正在测试的页面组成的信息。我做了一些基本假设:

  • 该页面有一个或多个li具有类的元素'resultItem',其中一些也具有类'isFavorite'
  • 这些li元素中的每一个都有一个或多个子元素,其中一个保证是divwith class 'name'
  • 只有一个这样的孩子div会有文本'f,f'

从广义上讲,我们有两种方法可以解决这个问题。

  1. 我们可以找到相关的div,然后验证其父级是否li有类'isFavorite'
  2. 我们可以找到所有li具有 class 的元素'isFavorite',然后验证其中一个是否包含相关的div.

这里有很多事情我们需要注意。

对于 Selenium,XPath 选择器擅长按文本查找,但不擅长按类查找。CSS 选择器擅长按类查找,但不能按文本查找。这些都不是找到div我们所追求的理想选择。

如上所述,我们可以使用element['class']. 正如我们发现的那样,element.class打电话Object#class给我们Selenium::WebDriver::Elementel['class'],在这种情况下,给了我们 String 'name'。如果在其父元素上调用,我们会得到'resultItem isFavorite'.

我们可以使用element.text. 在这种情况下el.text会给我们。'f,f'JavaScript 的 textContent 函数一样,它返回元素的文本及其所有后代,因此调用text()父元素也会给我们'f,f'. 请注意,此方法可能很慢,并且如果元素以某种方式不可见,则会返回一个空字符串。谨慎使用。有关更多信息,请参阅Selenium::WebDriver::Element.text

鉴于上述情况,让我们看看方法#1 和#2 是如何发挥作用的。(以下是 Ruby 1.9.3。)

方法#1

div_elements = @driver.find_elements(:css, 'li > div.name').select { |e| e.text == 'f,f' }
div_element = div_elements.first

parent_li = div_element.find_element(:xpath, './..')
parent_li_classes = parent_li['class'].scan(/\S+/)
if parent_li_classes.include?('isFavorite')
  # PASS
else
  # FAIL
end

方法#2

favorite_items = @driver.find_elements(:css, 'li.isFavorite')
if favorite_items.any? { |item| item.find_element(:css, 'div.name').text == 'f,f' }
  # PASS
else
  # FAIL
end

方法 #2,重构

if @driver.find_elements(:css, 'li.isFavorite').any? { |item| item.text == 'f,f' }
  # PASS
else
  # FAIL
end
于 2015-05-23T00:15:59.817 回答
2

红宝石

element.attribute("attribute name")

Python

element.get_attribute("attribute name")

爪哇

element.getAttribute("attribute name")

C#

element.GetAttribute("attribute name");
于 2017-08-24T14:04:28.153 回答
0

我能够通过另一种方式解决这个问题:

element = @driver.find_elements(:class, "isFavorite")
element.each do |t|
   if t.text() == 'f,f' then
       result = "pass"
   end
end

我觉得这可能真的很慢,如果有一个很长的列表......但至少它有效:)

谢谢

杰夫

于 2013-01-14T19:49:55.400 回答