我在这里阅读两个问题。首先,简短易懂。
问:现在我找到了el,如何访问它的类 HTML 属性?
答:使用el.attribute('class'),或其简写形式el['class']。见Selenium::WebDriver::Element.attribute。
现在更长了。
问:如何测试el 表示的项目是否被标记为收藏?
答:见下文。
为了提供更好的答案,我需要有关我们正在测试的页面组成的更多信息。我做了一些基本假设:
- 页面包含一个或多个
li 元素,其类为'resultItem',其中一些元素还具有'isFavorite' 类。
- 每个
li 元素都有一个或多个子元素,其中一个保证为div 类'name'。
- 只有一个这样的孩子
div 会有文字'f,f'。
一般来说,我们有两种方法可以解决这个问题。
- 我们可以找到相关的
div,然后验证其父li有类'isFavorite'。
- 我们可以找到类
'isFavorite'的所有li元素,然后验证其中一个元素是否包含相关的div。
这里有很多事情我们需要注意。
对于 Selenium,XPath 选择器擅长通过文本查找,但 poor at finding by class。 CSS 选择器擅长按类查找,但 cannot find by text。这些都不是找到我们所追求的div 的理想选择。
如上所述,我们可以使用element['class'] 获取元素的类(属性)。我们发现,element.class 调用 Object#class,给我们Selenium::WebDriver::Element。 el['class'],在这种情况下,给了我们字符串'name'。如果调用它的父元素,我们会得到'resultItem isFavorite'。
我们可以使用element.text 获取元素的文本。在这种情况下,el.text 会给我们'f,f'。与JavaScript's textContent function 一样,它返回元素的文本及其所有后代,因此在父元素上调用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