wait.until(ExpectedConditions.elementToBeClickable)不起作用

时间:2019-09-10 13:23:22

标签: javascript java html selenium

我需要通过By定位符从页面中获取所有元素,并从中确定可点击元素。

  • 更好理解的屏幕截图:
  

不可见元素

Invisible element

  

可见和可点击的元素

Visible and clickable element


  • 带有a.quick-view元素的html代码:

    <a href="http://prestashop-automation.qatestlab.com.ua/ru/blouses/2-7-blouse.html#/1-size-s/11-color-black" class="thumbnail product-thumbnail">
        <img src="http://prestashop-automation.qatestlab.com.ua/7-home_default/blouse.jpg" alt="" data-full-size-image-url="http://prestashop-automation.qatestlab.com.ua/7-large_default/blouse.jpg">
    </a>
    <div class="product-description">
        <h1 class="h3 product-title" itemprop="name"><a href="http://prestashop-automation.qatestlab.com.ua/ru/blouses/2-7-blouse.html#/1-size-s/11-color-black">Blouse</a></h1>
        <div class="product-price-and-shipping">
            <span itemprop="price" class="price">26,99&nbsp;₴</span>
        </div>
    </div>
    <ul class="product-flags">
    </ul>
    <div class="highlighted-informations hidden-sm-down">
    
        //============================
    
        <a href="#" class="quick-view" data-link-action="quickview"> //Searching element 
            <i class="material-icons search"></i> Быстрый просмотр
        </a>
    
        //=============================
    
        <div class="variant-links">
            <a href="http://prestashop-automation.qatestlab.com.ua/ru/blouses/2-8-blouse.html#/1-size-s/8-color-white" class="color" title="White" style="background-color: #ffffff"><span class="sr-only">White</span></a>
            <a href="http://prestashop-automation.qatestlab.com.ua/ru/blouses/2-9-blouse.html#/2-size-m/11-color-black" class="color" title="Black" style="background-color: #434A54"><span class="sr-only">Black</span></a>
            <span class="js-count count"></span>
        </div>
    </div>
    

因此,我通过//a[@class='quick-view'] xpath定位器搜索元素,并尝试通过wait.until(ExpectedConditions.elementToBeClickable)进行过滤:

public List<WebElement> getElementsIfClickable(PageElement element){
    List<WebElement> e = findAll(element);
    //e.get(0).click(); //WebDriverException: unknown error: Element <a href="#" class="quick-view" data-link-action="quickview">...</a> is not clickable at point (534, 840)
    WebDriverWait wait = new WebDriverWait(driver, 2);
    return  e.stream()
            .filter(p -> isClickable(p, wait))
            .collect(Collectors.toList());
}

private boolean isClickable(WebElement element, WebDriverWait wait) {
    try {
        WebElement el = wait.until(ExpectedConditions.elementToBeClickable(element));
        System.out.println(el.isDisplayed()); //DEBUG: always "true"
//el.click();  //no exception
        return el.isDisplayed();
    } catch (Exception e) {
        return false;
    }
}

因此,在“ DEBUG ”行中,我始终是真实的,但是elemnts不可点击且不会显示。

我不需要费心每个元素-我只需要检查clickable属性。

问题:

如何通过可点击属性检查元素

2 个答案:

答案 0 :(得分:1)

我不确定您点击属性的含义。从技术上讲,页面上的所有内容都是可点击的元素。例如,您可以单击文本,但是什么也不会发生。 以下是一个元素不可单击的唯一原因是,是否使用了Disabled属性:

<button type="button" disabled>Click Me!</button>

以下是禁用属性的链接: Input Disabled Field Disabled

但是,在您的情况下,您指的是始终可点击但可能通过三种方式禁用的锚标记(“禁用”是指当您单击它时什么也没有发生):

  1. 未设置“ href”属性
  2. 由CSS禁用
  3. 设置了href或onclick会返回false:

<a href="javascript:function() { return false; }">link</a>
<a href="/" onclick="return false;">link</a>
如果您仍然想测试此元素是否可点击,则可以使用类似javascript这样的脏方式:

JavascriptExecutor js= (JavascriptExecutor)driver;
String url = driver.getCurrentUrl();
js.executeScript("arguments[0].click();", element);
//may need a wait here
if(url.equalsIgnoreCase(driver.getCurrentUrl())) {
        js.executeScript("window.history.go(-1);");
    }else {
        //element is not clickable
    }

可能不是最好的解决方案,但它可以工作:)

答案 1 :(得分:1)

硒可点击的唯一含义是可见并启用: https://github.com/SeleniumHQ/selenium/blob/c982edfbd3eed3ffb9666c4f3e9df7c004834c22/java/client/src/org/openqa/selenium/support/ui/ExpectedConditions.java#L632

因此,您要做的就是检查webElement是否为isDisplayed()和isEnabled()。

    List<WebElement> webElements  = driver.findElements(By.xpath("//a[@class='quick-view']"));
    for (WebElement e :webElements) { 
        if (e.isDisplayed() && e.isEnabled()) {
            System.out.println(e.getAttribute("href"));
        }
    }