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"]')));
我正在尝试做一些与您类似的事情 - 使用 WebDriverWait
和 ExpectedConditions
这样我就可以等待元素出现并将其定位为相对于现有的。
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]")));
我在页面上有一个 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"]')));
我正在尝试做一些与您类似的事情 - 使用 WebDriverWait
和 ExpectedConditions
这样我就可以等待元素出现并将其定位为相对于现有的。
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]")));