私はこの問題の解決策を見つけようとし、多くの時間を費やしましたが、それを行うことはほとんど不可能です。
問題:FirefoxでJavaでSeleniumを使用しています。要素(リストボックス)を見つけてクリックする必要があります。したがって、コードは要素を検出しますが、クリックアクションは機能しません。これは、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); } }
要素の画像があります:
誰かがそれを行う方法を知っていますか?