Selenide:如何从 ElementsCollection 中获取所有活动元素?
Selenide: How to get all active elements from ElementsCollection?
我正在尝试为集合编写 if 语句,但遇到了问题。例如,以下元素具有 li
标记,指示该元素是否处于活动状态:
<dl class="p-property-item">
<dt class="p-item-title" data-spm-anchor-id="42e07cb3WzvrLA">Color:</dt>
<dd class="p-item-main">
<ul id="j-sku-list-3" class="sku-attr-list util-clearfix" data-sku-prop-id="14" data-sku-show-type="none" data-isselect="true" data-spm-anchor-id="2114.10010108.1000016/B.i3.42e07cb3WzvrLA">
<li class="active">
<a data-role="sku" data-sku-id="29" id="sku-2-29" href="javascript:void(0)" data-spm-anchor-id="2114.10010108">
<span data-spm-anchor-id="42e07cb3WzvrLA">White</span>
</a>
</li>
</ul>
<div data-role="msg-error" class="msg-error sku-msg-error" style="display: none;">
Please select a Color
</div>
</dd>
我从页面中获取所有元素并将其放入集合中:
@FindBy(how = How.CSS, using = "#j-product-info-sku > dl:nth-child(2) > dd > ul > li > a > span")
private ElementsCollection colorList;
public ElementsCollection getColor() { return colorList; }
但我不知道如何从具有 "active" li
的集合中获取元素。我的意思是,如何获取所有活动元素,是否有识别它们的选项?
注意:所有元素都是可见的,因此与按可见选项过滤无关。
我也使用了这里提到的java方法:
public static Condition hasChildWithCondition(final By locator, final Condition condition) {
return new Condition("hasChildWithCondition") {
public boolean apply(WebElement element) {
return element.findElements(locator).stream().
filter(child -> condition.apply(child)).count() > 0;
}
public String toString() {
return this.name;
}
};
}
Condition hasChild = hasChildWithCondition(By.cssSelector("li"), Condition.text("active"));
if ((page.getColor().size() != 0) && (page.getColor().filterBy(hasChild))){
//to do
}
但在我的例子中我得到一个错误:Operator && cannot be applied to 'boolean','com.codeborne.selenide.ElementsCollection'
您可以使用 ElementsCollection 的 size 方法进行检查:
&& (page.getColor().filterBy(hasChild)).size() != 0){
//to do
您在 return 个 span
元素集合下方使用的定位器,您无法使用父 li
元素过滤它:
@FindBy(how = How.CSS, using = "#j-product-info-sku > dl:nth-child(2) > dd > ul > li > a > span")
您可以使用.p-property-item li.active span
css 选择器直接获取所有活动元素。
您还可以使用 .p-property-item li
选择器获取 li
元素的集合,然后按 active
class 过滤并获取颜色。
在下面的方法中,您尝试按 text
而不是 class
进行过滤,请使用 Condition.cssClass("active")
:
Condition hasChild = hasChildWithCondition(By.cssSelector("li"), Condition.text("active"));
您的代码应如下所示:
ElementsCollection colorList = $$(".p-property-item li");
String activeColor = colorList.filterBy(Condition.cssClass("active")).shouldHaveSize(1).$("span").text();
//or
ElementsCollection colorList = $$("#j-product-info-sku > dl:nth-child(2) > dd > ul > li");
ElementsCollection activeList = colorList.filterBy(Condition.cssClass("active"));
ElementsCollection disabledList = colorList.filterBy(Condition.cssClass("disabled"));
找到解决方案:为了只将活动元素放入集合中,我决定忽略 class "disabled"
中的 li
个元素
ElementsCollection colorList = $$("#j-product-info-sku > .p-property-item > .p-item-main > ul > li:not(.disabled) > a");
截至目前,该集合仅包含活动元素
我正在尝试为集合编写 if 语句,但遇到了问题。例如,以下元素具有 li
标记,指示该元素是否处于活动状态:
<dl class="p-property-item">
<dt class="p-item-title" data-spm-anchor-id="42e07cb3WzvrLA">Color:</dt>
<dd class="p-item-main">
<ul id="j-sku-list-3" class="sku-attr-list util-clearfix" data-sku-prop-id="14" data-sku-show-type="none" data-isselect="true" data-spm-anchor-id="2114.10010108.1000016/B.i3.42e07cb3WzvrLA">
<li class="active">
<a data-role="sku" data-sku-id="29" id="sku-2-29" href="javascript:void(0)" data-spm-anchor-id="2114.10010108">
<span data-spm-anchor-id="42e07cb3WzvrLA">White</span>
</a>
</li>
</ul>
<div data-role="msg-error" class="msg-error sku-msg-error" style="display: none;">
Please select a Color
</div>
</dd>
我从页面中获取所有元素并将其放入集合中:
@FindBy(how = How.CSS, using = "#j-product-info-sku > dl:nth-child(2) > dd > ul > li > a > span")
private ElementsCollection colorList;
public ElementsCollection getColor() { return colorList; }
但我不知道如何从具有 "active" li
的集合中获取元素。我的意思是,如何获取所有活动元素,是否有识别它们的选项?
注意:所有元素都是可见的,因此与按可见选项过滤无关。
我也使用了这里提到的java方法:
public static Condition hasChildWithCondition(final By locator, final Condition condition) {
return new Condition("hasChildWithCondition") {
public boolean apply(WebElement element) {
return element.findElements(locator).stream().
filter(child -> condition.apply(child)).count() > 0;
}
public String toString() {
return this.name;
}
};
}
Condition hasChild = hasChildWithCondition(By.cssSelector("li"), Condition.text("active"));
if ((page.getColor().size() != 0) && (page.getColor().filterBy(hasChild))){
//to do
}
但在我的例子中我得到一个错误:Operator && cannot be applied to 'boolean','com.codeborne.selenide.ElementsCollection'
您可以使用 ElementsCollection 的 size 方法进行检查:
&& (page.getColor().filterBy(hasChild)).size() != 0){
//to do
您在 return 个 span
元素集合下方使用的定位器,您无法使用父 li
元素过滤它:
@FindBy(how = How.CSS, using = "#j-product-info-sku > dl:nth-child(2) > dd > ul > li > a > span")
您可以使用.p-property-item li.active span
css 选择器直接获取所有活动元素。
您还可以使用 .p-property-item li
选择器获取 li
元素的集合,然后按 active
class 过滤并获取颜色。
在下面的方法中,您尝试按 text
而不是 class
进行过滤,请使用 Condition.cssClass("active")
:
Condition hasChild = hasChildWithCondition(By.cssSelector("li"), Condition.text("active"));
您的代码应如下所示:
ElementsCollection colorList = $$(".p-property-item li");
String activeColor = colorList.filterBy(Condition.cssClass("active")).shouldHaveSize(1).$("span").text();
//or
ElementsCollection colorList = $$("#j-product-info-sku > dl:nth-child(2) > dd > ul > li");
ElementsCollection activeList = colorList.filterBy(Condition.cssClass("active"));
ElementsCollection disabledList = colorList.filterBy(Condition.cssClass("disabled"));
找到解决方案:为了只将活动元素放入集合中,我决定忽略 class "disabled"
中的li
个元素
ElementsCollection colorList = $$("#j-product-info-sku > .p-property-item > .p-item-main > ul > li:not(.disabled) > a");
截至目前,该集合仅包含活动元素