20

私はこの問題の解決策を見つけようとし、多くの時間を費やしましたが、それを行うことはほとんど不可能です。

問題: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">

多くの解決策を試しましたが、うまくいくこともありますが、次にプログラムを実行すると、再び機能しません。

いくつかの解決策:

  1. 要素を検出しますが、クリックアクションは実行しません。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")
    
  2. 時間のせいなのに、そうやって解決しようと思いました。

    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();
    
  3. 最後に、私は少し必死で、これをほぼ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);
        }
    }
    

要素の画像があります:

要素1 要素2

誰かがそれを行う方法を知っていますか?

4

6 に答える 6

24

最後に、FirefoxとGoogleChromeで機能する答えを見つけました。

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"));
于 2013-03-12T10:15:43.357 に答える
2

なぜこのXpathを使用しているのかわかりません。Xpathを自由に変更してから、セレンIDEを使用して要素を記録し、Xpath::positionドロップダウンリストから使用するとtarget(htmlヘッダーに対して一意のパスが選択されます)、動的ロケーターの問題が解決されます。 。そして、以下のイベントを試してみてください。

1-を使用しclickAtます。

2-を使用fireevent(focus)してクリックします。バックグラウンドの一部の要素が読み込まれることがあります。読み込まれると、フォーカスがそこに移動するため、elementNotVisibleエラーが発生します。

3-を使用しmouseDownRightます。

于 2013-03-09T14:51:27.683 に答える
1

Firefoxでも同じ問題があります。秘訣は、ボタン自体ではなく、内部のテキストをクリックすることです。

于 2013-09-18T18:40:05.847 に答える
1

私にはいくつかの解決策があります。ロボットでクラスを作成し、そこにTABイベントキーを配置してから、そのクラスを呼び出します。ページに焦点を合わせるために戻るようなものです。一部のラゾンでは、ページのフォーカスが失われ、そのボタンが見つかりません。

   Robot robot;
    try {
        robot = new Robot();
        robot.keyPress(KeyEvent.VK_TAB);
        robot.keyRelease(KeyEvent.VK_TAB);

    } catch (AWTException e) {e.printStackTrace();}
于 2017-10-14T17:57:57.523 に答える
0

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();
于 2017-04-22T15:21:16.290 に答える
0
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.click(element);
Action action = actions.build();
action.perform();

これは私のために働いた。

于 2020-04-30T09:04:23.100 に答える