Selenium:在 Java 中搜索 By 定位器的子项

Selenium: searching children of a By locator in Java

我在页面上有一个 WebElements 的按定位器枚举列表。我希望能够 select 使用枚举组合的 select 框的特定选项以及我希望 select 的选项值的附加信息。有什么办法吗?我注意到 By class 也有方法 findElement(searchContext)。我可以按照以下方式使用它吗:

public enum Dictionary {

    TYPE                        (By.id("vehType")),
    PROVINCE                    (By.id("provId")),
    TERRITORY                   (By.id("territoryId")),
    STAT_CODE                   (By.id("statCodeId")),
    CLASS                       (By.id("class1Id"));

    private final By locator;

    private DetailVehicleDictionary (By value) {
        this.locator = value;
    }

    public By getLocation() {
        return this.locator;
    }
}

然后如果 CLASS 是一个 select 框,其中 HTML 为:

<select id="class1Id" name="select_box">
    <option value="1"/>
    <option value="2"/>
    <option value="3"/>
</select>

我可以按照以下方式做一些事情吗:

WebElement specificValue = driver.findElement(Dictionary.CLASS.getLocation().findElement(By.cssSelector("option[value=2]"));

我需要访问实际元素,以便我可以等待值出现在 DOM 中。我计划在等待命令中实现它,例如:

wait.until(ExpectedConditions.presenceOfElementLocated(specificValue));

Selenium 有一个 special mechanism 来处理 "select/option" 个案例:

import org.openqa.selenium.support.ui.Select;  // this is how to import it

WebElement select = driver.findElement(Dictionary.CLASS.getLocation());
Select dropDown = new Select(select); 
dropDown.selectByValue("1");

后续问题的答案:使用 Explicit Wait:

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement select = wait.until(ExpectedConditions.presenceOfElement(Dictionary.CLASS.getLocation()));

如果等待选项在 select 中加载,恐怕您需要自定义 ExpectedCondition(未测试):

public static ExpectedCondition<Boolean> selectContainsOption(
    final WebElement select, final By locator) {

    return new ExpectedCondition<Boolean>() {
        @Override
        public Boolean apply(WebDriver driver) {
            try {
                return elementIfVisible(select.findElement(locator));
            } catch (StaleElementReferenceException e) {
                return null;
            }
        }
    };
}

用法:

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement select = wait.until(ExpectedConditions.presenceOfElement(Dictionary.CLASS.getLocation()));
WebElement option = wait.until(selectContainsOption(select, By.cssSelector('.//option[@value = "1"]')));   

我正在尝试做一些与您类似的事情 - 使用 WebDriverWaitExpectedConditions 这样我就可以等待元素出现并将其定位为相对于现有的。

Selenium 中现在可以使用其他方法来处理此问题:

static ExpectedCondition<WebElement> presenceOfNestedElementLocatedBy(By locator, By sub_locator) 期望将子 WebElement 检查为父元素的一部分以呈现

static ExpectedCondition<WebElement> presenceOfNestedElementLocatedBy(WebElement element, By sub_locator) 期望检查子 WebElement 作为父元素的一部分存在

static ExpectedCondition<java.util.List<WebElement>> presenceOfNestedElementsLocatedBy(By locator, By sub_locator) 期望将子 WebElement 检查为父元素的一部分以呈现

因此对于您的情况,您可以执行以下操作:

     wait.until(ExpectedConditions.presenceOfNestedElementLocatedBy(Dictionary.CLASS.getLocation(), By.cssSelector("option[value=2]")));

请在此处查看 Javadoc:https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html#presenceOfNestedElementLocatedBy-org.openqa.selenium.By-org.openqa.selenium.By-