使用Watir匹配和排除多个类

时间:2014-01-20 07:18:39

标签: ruby watir

我希望能够在排除某些课程的同时与课程相匹配。

我可以使用类似下面的内容来获取与指定类匹配的所有li元素,但我不确定如何同时筛选出类。

b = Watir::Browser.new
free_boxes = b.lis(:class, /cellGridGameStandard/)

我想将此更改为与cellGridGameStandard类匹配所有li元素的内容,但不包括同时包含notEligible类或ownAlready类的所有元素。

1 个答案:

答案 0 :(得分:3)

以下是几个选项。

让我们假设html就像:

<ul>
    <li class="cellGridGameStandard">
        Element 1
    </li>
    <li class="cellGridGameStandard ownAlready">
        Element 2
    </li>
    <li class="cellGridGameStandard notEligible">
        Element 3
    </li>
    <li class="cellGridGameStandard">
        Element 4
    </li>
</ul>

第一个和第四个li元素符合指定的条件。

一种选择是检查没有ownAlreadynotEligible类的lis:

matching = browser.lis(:class => 'cellGridGameStandard')
    .find_all { |li|
        ['ownAlready', 'notEligible'].none? { 
            |class_name| li.class_name.split.include? class_name
        }
    }
p matching.collect(&:text)
#=> ["Element 1", "Element 4"]

另一种选择,更易于编写但有时被认为更难阅读,是使用css定位器:

matching = browser.elements(:css => 'li.cellGridGameStandard:not(.ownAlready):not(.notEligible)')
p matching.collect(&:text)
#=> ["Element 1", "Element 4"]