私はこの問題の解決策を見つけようとしましたが、多くの時間を費やしましたが、それを行うことはほとんど不可能です。
問題:私は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);
}
}
要素の画像があります:
誰かがそれを行う方法を知っていますか?
最後に、FirefoxとGoogle Chromeで動作する答えを見つけました。
WebElement we = this.driver.findElement(By.id("size-btn"));
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", we);
waitForElementPresent(By.xpath("//div[@id='size-btn' and contains(@class,'opened')]/span"));
私を読んでくれてありがとう。
なぜこのXpathを使用しているのかわかりません。Xpathを変更する自由がある場合は、Selenium IDEを使用して要素を記録し、target
(itのドロップダウンリストからXpath::position
を使用してください。 htmlヘッダーに関連する一意のパスを選択します)、ダイナミックロケーターの問題を解決します。次に、前述のイベントを試してください。
1- clickAt
を使用します。
2- fireevent(focus)
を使用してクリックします。時々、バックグラウンドのいくつかの要素がロードされ、ロードされるとそこにフォーカスが移動するため、elementNotVisibleエラーが発生します。
3- mouseDownRight
を使用します。
私はいくつかの解決策を持っています、ロボットがそこにTABイベントキーを置いたクラスを作り、そのクラスを呼び出します。ページに焦点を合わせると、それはどのように機能しますか。一部のrazonでは、ページがフォーカスを失い、そのボタンを見つけることができませんでした。
Robot robot;
try {
robot = new Robot();
robot.keyPress(KeyEvent.VK_TAB);
robot.keyRelease(KeyEvent.VK_TAB);
} catch (AWTException e) {e.printStackTrace();}
Firefoxでも同じ問題があります。トリックは、ボタン自体ではなく内部のテキストをクリックすることです。
Org.openqa.Selenium.interactionsのActionsクラスを使用してみてください:
WebElement element = driver.findElement(By.id("size-btn"));
Actions builder = new Actions(driver);
builder.moveToElement(element).click(element);
builder.perform();