我在这里读了两个问题。第一,简短,简单。
问:现在我找到el
了,如何访问它的 class HTML 属性?
A:使用el.attribute('class')
,或者它的简写el['class']
。请参阅Selenium::WebDriver::Element.attribute。
现在更长的。
问:如何测试由 表示的项目el
是否被标记为收藏?
答:见下文。
为了给出更好的答案,我需要更多关于我们正在测试的页面组成的信息。我做了一些基本假设:
- 该页面有一个或多个
li
具有类的元素'resultItem'
,其中一些也具有类'isFavorite'
。
- 这些
li
元素中的每一个都有一个或多个子元素,其中一个保证是div
with class 'name'
。
- 只有一个这样的孩子
div
会有文本'f,f'
。
从广义上讲,我们有两种方法可以解决这个问题。
- 我们可以找到相关的
div
,然后验证其父级是否li
有类'isFavorite'
。
- 我们可以找到所有
li
具有 class 的元素'isFavorite'
,然后验证其中一个是否包含相关的div
.
这里有很多事情我们需要注意。
对于 Selenium,XPath 选择器擅长按文本查找,但不擅长按类查找。CSS 选择器擅长按类查找,但不能按文本查找。这些都不是找到div
我们所追求的理想选择。
如上所述,我们可以使用element['class']
. 正如我们发现的那样,element.class
打电话Object#class
给我们Selenium::WebDriver::Element
。 el['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