java 当元素隐藏且不可点击时,Selenium将隐藏元素返回为可见、可点击和启用

uujelgoq  于 2023-01-11  发布在  Java
关注(0)|答案(4)|浏览(172)

我只想在过滤器还没有打开时打开它们。为此,我检查“应用过滤器”按钮是否可见/可点击。
令我惊讶的是,我得到的元素是可见/可点击的,即使它不是。
下面提到的按钮代码,

<div class="m-t-20 text-left filter-btn-holder ">
   <input type="hidden" id="filterType" value="">
   <button type="button" class="submit btn btn-primary btn-mini filter-focus" id="filterButton" onclick="javascript:getFilteredMedia(true);" "="">Filter</button>
   <button type="button" class="submit btn btn-danger btn-mini" id="filterButton" onclick="clearFilter();">Reset</button>
   <button type="button" class="submit btn btn-mini" data-webarch="toggle-right-side" id="closeButton"><i class="fa fa-times" aria-hidden="true"></i></button>
</div>

方法尝试检查元素是否可单击

public boolean isClickable(WebElement el) 
    {
        try{
            WebDriverWait wait = new WebDriverWait(driver, 6);
            wait.until(ExpectedConditions.elementToBeClickable(el));
            return true;
        }
        catch (Exception e){
            return false;
        }
    }

按钮的XPath:xpath = "//button[@id='filterButton' and text()[contains(.,'Filter')]]

jdgnovmf

jdgnovmf1#

试试这个:

public boolean isClickable(WebElement el) 
{
    try{
        WebDriverWait wait = new WebDriverWait(driver, 6);
        wait.until(ExpectedConditions.elementToBeClickable(el));
        return el.isDisplayed() && el.isEnabled();
    }
    catch (Exception e){
        return false;
    }
}
bejyjqdl

bejyjqdl2#

请使用id=__multiselect_mediatag的元素,而不是其子元素。

bxpogfeg

bxpogfeg3#

虽然我没有得到确切的答案,但我找到了一些变通方法。检查父元素类是否可见,或者是否使用javascript执行器。
我还是不明白为什么一个看不见的元素变得可见了。

JavascriptExecutor js = (JavascriptExecutor)driver;
String className = (String) js.executeScript("return document.getElementById('chat-users').getAttribute('class');");
1cklez4t

1cklez4t4#

我也遇到过类似的问题。作为客户端输入验证的一部分,我们提供了一个框,列出了所有发现的错误。当然,该框包含了所有可能的错误消息,并且我们从Javascript切换它们的显示。然而,在填充了一个输入字段(并且其相关的错误消息被隐藏)之后,新的查询将报告它仍然可见。

// always returns the same list as the first time it's called
public static List<String> getErrorGroupMsgs(TestState state) {
    List<String> list = new ArrayList<>();
    WebDriver driver = state.getDriver();
    WebElement errorBox = driver.findElement(By.id(state.getProperty("errorBoxGroupId")));
    for(WebElement div : errorBox.findElements(By.tagName("div"))) {
        if(div.isDisplayed()) {
            list.add(div.getDomProperty("innerText").trim());
        }
    }
    return list;
}

在将文本发送到输入字段和重新读取显示的消息之间添加延迟并没有帮助,但最终有帮助的是使用不同的参数插入另一个对**findElements()**的调用。

// returns an updated view of the world
public static List<String> getErrorGroupMsgs(TestState state) {
    List<String> list = new ArrayList<>();
    WebDriver driver = state.getDriver();
    WebElement errorBox = driver.findElement(By.id(state.getProperty("errorBoxGroupId")));
    // this line refreshes the errorBox element so we can get an accurate count below ....
    errorBox.findElements(By.cssSelector("div[display='block']"));
    for(WebElement div : errorBox.findElements(By.tagName("div"))) {
        if(div.isDisplayed()) {
            list.add(div.getDomProperty("innerText").trim());
        }
    }
    return list;
}

相关问题