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

时间:2015-02-06 18:13:10

标签: java selenium selenium-webdriver

我在页面上有一个用于WebElements的By locators的枚举列表。我希望能够使用枚举的组合以及我想要选择的选项的值的附加信息来选择选择框的特定选项。有没有办法做到这一点?我注意到By类也有方法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是一个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));

2 个答案:

答案 0 :(得分:3)

Selenium有special mechanism来处理“选择/选项”案例:

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

如果等待选项加载到选择内部,我担心,您需要进行自定义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"]')));   

答案 1 :(得分:1)

我试图做一些与你类似的事情 - 使用@pytest.mark.liveWebDriverWait,以便我可以等待元素在那里并将其定位为相对于现有元素的子元素

Selenium现在提供了其他方法来处理这个问题:

ExpectedConditions 期望将子WebElement检查为要呈现的父元素的一部分

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)

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