Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Selenium java,在xpath匹配多个元素的情况下,通过xpath和匹配文本等待元素_Java_Selenium_Selenium Webdriver_Webdriver_Webdriverwait - Fatal编程技术网

Selenium java,在xpath匹配多个元素的情况下,通过xpath和匹配文本等待元素

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)

我正在尝试等待具有特定css和内部文本的元素。 我有多个元素满足css条件(元素可以是可见的/不可见的),selenium ExpectedConditions没有按照我想要的方式运行

如果我尝试先通过css查找元素,然后自己过滤掉,我有时会错过想要的元素,因为有些元素可能没有加载

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();