Selenium java,在xpath匹配多个元素的情况下,通过xpath和匹配文本等待元素
我正在尝试等待具有特定css和内部文本的元素。 我有多个元素满足css条件(元素可以是可见的/不可见的),selenium ExpectedConditions没有按照我想要的方式运行 如果我尝试先通过css查找元素,然后自己过滤掉,我有时会错过想要的元素,因为有些元素可能没有加载Selenium java,在xpath匹配多个元素的情况下,通过xpath和匹配文本等待元素,java,selenium,selenium-webdriver,webdriver,webdriverwait,Java,Selenium,Selenium Webdriver,Webdriver,Webdriverwait,我正在尝试等待具有特定css和内部文本的元素。 我有多个元素满足css条件(元素可以是可见的/不可见的),selenium ExpectedConditions没有按照我想要的方式运行 如果我尝试先通过css查找元素,然后自己过滤掉,我有时会错过想要的元素,因为有些元素可能没有加载 By cssBy = By.css("CSS_HERE"); wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(cssBy)
By cssBy = By.css("CSS_HERE");
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(cssBy);
List<WebElement> tabs = driver.findElements(cssBy);
WebElement element =
tabs.stream().filter(tab -> tab.getText().contains("TARGET_TEXT")).findAny().get();
但是我认为上面的代码片段正在选择它能找到的第一个匹配CSS的元素,并等待它的文本成为TARGET\u text
,这不是我的意图
如果有多个元素与定位器匹配,是否建议等待文本匹配?您可以编写自己的预期条件方法这里是textMatches()的示例
public static ExpectedCondition textMatches(按定位器最终,最终模式){
返回新的ExpectedCondition(){
@凌驾
公共列表应用(WebDriver){
字符串当前值;
列表元素=driver.findElements(定位器);
List matchingElements=new ArrayList();
for(WebElement:elements){
currentValue=element.getText();
if(pattern.matcher(currentValue.find()){
匹配元素。添加(元素);
}
}
返回匹配元素;
}
@凌驾
公共字符串toString(){
返回“+定位器的匹配元素”;
}
};
}
而不是allelementslocatedby()的存在
您需要对allelementslocatedby()的可见性进行归纳
,您可以使用以下方法:
By cssBy=By.css(“这里是css_”);
等待。直到(预期条件。由(cssBy)指定的所有人员的可视性);
列表选项卡=driver.findElements(cssBy);
WebElement元素=
tabs.stream().filter(tab->tab.getText().contains(“TARGET_TEXT”)).findAny().get();
在上面的代码段中,直接返回第一个不匹配项会失败,对吗?假设我有两个元素与定位器匹配。第一个元素与文本模式不匹配。在这种情况下,代码段不会总是失败吗?虽然我明白了这一点,但我可以跟踪匹配的元素,并返回它们为非空,否则为空。谢谢,尽管如此这是一个很好的方法。我有选项卡式布局。因此,与定位器匹配的某些元素可能不在活动选项卡中,因此不可见。很抱歉,我没有在问题中提到这一点。我将更新它。但当所有内容都显示在屏幕上时,这是一个很好的解决方案,因为它不需要任何自定义预期。Thanks@NagendraGupta具有讽刺意味的是,“s”的核心功能ty将与屏幕上可见的s交互。其他选项卡中的元素以及不可见的元素需要以不同的方式处理。
By cssBy = By.css("CSS_HERE");
wait.until(ExpectedConditions.textMatches(cssBy, "TARGET_TEXT");
....
public static ExpectedCondition<List<WebElement>> textMatches(final By locator, final Pattern pattern) {
return new ExpectedCondition<List<WebElement>>() {
@Override
public List<WebElement> apply(WebDriver driver) {
String currentValue;
List<WebElement> elements = driver.findElements(locator);
List<WebElement> matchingElements = new ArrayList();
for(WebElement element : elements){
currentValue = element.getText();
if (pattern.matcher(currentValue).find()){
matchingElements.add(element);
}
}
return matchingElements;
}
@Override
public String toString() {
return "matching elements for " + locator;
}
};
}
By cssBy = By.css("CSS_HERE");
wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(cssBy);
List<WebElement> tabs = driver.findElements(cssBy);
WebElement element =
tabs.stream().filter(tab -> tab.getText().contains("TARGET_TEXT")).findAny().get();