我下面有一个 if 语句,这给我带来了问题。 如果在不同的下拉列表中进行了某些选择,页面将显示第二个下拉列表和一个复选框。当选择导致这两个元素显示时,下面的代码将按预期工作,但如果选择不显示这两个元素,则代码不会按预期工作。我收到
no such element: Unable to locate element
错误。起初我认为无论哪种方式它都会返回 true,但问题是它崩溃了,因为。我什至在尝试将值分配给布尔值时添加了检查,但仍然遇到相同的错误。
boolean dropdown = driver.findElement(By.id("DROPDOWN")).isDisplayed();
得到同样的错误。
if(driver.findElement(By.id("DROPDOWN")).isDisplayed()){
driver.findElement(By.id("DROPDOWN")).click();
driver.findElement(By.xpath("Choice in Drop DOWN)).click();
driver.findElement(By.id("CheckBox")).click();
}
findElement 方法将抛出此硬异常 - 如果未找到该元素,则没有此类元素。只需包含对“没有这样的元素”的异常处理,您的逻辑就应该可以正常工作。
try{
if(driver.findElement(By.id("DROPDOWN")).isDisplayed()){
driver.findElement(By.id("DROPDOWN")).click();
driver.findElement(By.xpath("Choice in Drop DOWN)).click();
driver.findElement(By.id("CheckBox")).click();
}
catch (NoSuchElementException e)
{
// I believe you dont have to do anything here. May be a console log will do.
}
以下答案解释了如何处理检查元素是否存在以及如何通过包装在自定义方法中来处理异常。
如何检查 Element 是否存在于 C# Selenium 驱动程序中
我还建议按照以下方式重写代码,以避免重复并避免使用 xpath 选择器。在同一上下文中使用 findElement 两次是不必要的,只需创建一个变量即可。
var dropdown = driver.findElement(By.id("DROPDOWN"));
if (dropdown.Displayed())
{
var selectElement = new SelectElement(dropdown);
selectElement.SelectByValue("valuehere");
}
如果您使用的是文本而不是选择框中的值,您可以使用 SelectByText("texthere");而不是按值选择。
isDisplayed() 将起作用,后跟 style 属性:- display 不应该为 false 或 none。
如果先前的操作是导致两个元素都显示的选择,则意味着该元素位于 DOM 中,但不可见。因此检查可见性条件将返回 false。
尝试等待元素变得可见并对其执行检查操作,这将减少同步延迟。
WebDriverWait 等待 = new WebDriverWait(WebDriverRunner.getWebDriver(),5); wait.until(ExpectedConditions.visibilityOfElementLocated("按定位器"));
if (dropdown.isDisplayed())
`````````// If the dropdown is tagged with <Select> tag
``````````` Select dropDown = new Select(dropdown);
```````````dropDown .selectByValue("value);
```````` // Else fetch the dropdown list item and store it in a list and iterate through and perform the desired action
```````````List<WebElement> dropDownList = new ArrayList<Webelements>;
```````````dropDownList.forEach(element -> {
```````````if(element.getText().equals("value")){
``````` ````element.click();
``````````` }
``````````` });
```````````driver.findElement(By.id("CheckBox")).click();
}
这与 DOM 中存在的元素与 UI 中可见的元素有关。相反,您应该使用 findElements。当您保存列表然后使用条件来确保它是否在找到的元素列表中时,它不会产生硬异常错误。
List<WebElement> ele=driver.findElements(admPage.specificEntitlement);
if(ele.size()== 0){
// empty list if no matching element
System.out.println("Element not present, appearing "+ele.size()+ " time");
} else {
System.out.println("Element present, appearing "+ele.size()+ " time");
}