Selenium / Firefox:命令“.click()”不适用于找到的元素
2022-09-02 09:58:19
我试图找到解决这个问题的方法,我花了很多时间,但这对我来说几乎是不可能的。
问题是:我在Firefox中使用Selenium和Java。我需要找到一个元素(列表框)并单击它。因此,代码会找到该元素,但单击操作不起作用。它每次在Google Chrome中都可以正常工作,有时在Firefox中也可以正常工作(使用相同的Java代码有时有效,有时不起作用)。
当程序在页面上输入时,有一部分代码带有该元素:
<div id="size-btn" class="size-btn">
<span class="selected-size">SELECCIONA TALLA </span>
<div class="size-select" style="display: none;">
<table>
<tbody>
<tr id="selecsize_2" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051607">
<tr id="selecsize_3" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051608">
<tr id="selecsize_4" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051609">
<tr id="selecsize_5" class="product-size" data-ga-props="{action:'Seleccionar_Producto', opt_label:'Escoger_Talla'}" data-catentryid="1051610">
</tbody>
</table>
<button class="size-guide gaViewEvent gaTrack" data-ga-props="{action:'Seleccionar_Talla', opt_label:'Guia_de_tallas'}" data-href="http://www.anyweb.com/webapp/wcs/stores/servlet/ProductGuideSizeAjaxView?catalogId=24052&categoryId=358056&langId=-5&productId=1047599&storeId=10701">Guía de tallas</button>
</div>
</div>
还有一部分代码在单击元素时会发生变化:
<div id="size-btn" class="size-btn opened">
我尝试了许多解决方案,有时它可以工作,但是下次我运行该程序时,它不再起作用。
一些解决方案:
-
它查找元素,但不运行单击操作。我用xpath和cssSelector检查了一下,这些表达式中发现了独特的元素。
driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")).click(); // Also checked with By.cssSelector("span.selected-size")
-
我虽然是因为时间,所以我试图以这种方式解决它。
WebElement we = driver.findElement(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span")); // By.cssSelector("span.selected-size") Thread.sleep(3000); we.click();
-
最后,我有点绝望,我创建了一个新函数来尝试这样做近60次,寻找元素代码的更改,如果有任何更改,只是尝试再次执行单击操作。
clickAndWaitWhileElementIsNotPresent(By.xpath("//div[@id='size-btn' and not(contains(@class,'opened'))]/span"),By.xpath("//div[@class='size-btn opened']/span")); // By.cssSelector("span.selected-size") private void clickAndWaitWhileElementIsNotPresent(By by1, By by2) throws Exception { for (int second = 0;; second++) { if (second >= 60) fail("timeout"); try { if (isElementPresent(by2)) { break; } else { driver.findElement(by1).click(); } } catch (Exception e) { } Thread.sleep(1000); } }
有该元素的图像:
有人知道如何做到这一点吗?