我需要通过By
定位符从页面中获取所有元素,并从中确定可点击元素。
不可见元素
可见和可点击的元素
带有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 ₴</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属性。
如何通过可点击属性检查元素
答案 0 :(得分:1)
我不确定您点击属性的含义。从技术上讲,页面上的所有内容都是可点击的元素。例如,您可以单击文本,但是什么也不会发生。 以下是一个元素不可单击的唯一原因是,是否使用了Disabled属性:
<button type="button" disabled>Click Me!</button>
以下是禁用属性的链接: Input Disabled Field Disabled
但是,在您的情况下,您指的是始终可点击但可能通过三种方式禁用的锚标记(“禁用”是指当您单击它时什么也没有发生):
<a href="javascript:function() { return false; }">link</a>
<a href="/" onclick="return false;">link</a>
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)
因此,您要做的就是检查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"));
}
}