web-dev-qa-db-ja.com

セレンは要素を「正常に」クリックしましたが、実際にはクリックされていません

ボタンをクリックするメソッドがありますが、実行すると、Seleniumは実際にはボタンが実際にはクリックされていないのに、正常にクリックされたときに結果を返します。テストを何度か実行すると、期待どおりにクリックされることがあります。テストフレームワークを約15秒間の暗黙の待機として設定し、この要素に対して明示的な待機を設定しましたが、それでも同じ問題が発生します。 <element>.isDisplayed()を実行すると、要素は常に見つかります。 .clickをwhileループに配置して数回クリックしましたが、ほとんどの場合機能しますが、それでもテストが失敗することがあります。ボタンをクリックする前に、要素が実際に表示されているかどうかを確認するifステートメントを持つことはできますか?

私はもう試した:

if(!element.isDisplayed){
    element.click
}

ここに私が問題を抱えているボタンがあります:

<button class="notkoButton listNew">
<div class="l6e iconAdd">New List</div>
</button>

これが私の方法です:

public marketing_lists_page navigateToNewListPage() throws Throwable {
    try {
        int x = 0;
        while(x < 5) {
            newListBtn.click();
            x++;
        }
       //newListPageHeader.isDisplayed();
    } catch (NoSuchElementException e){
        logs.errorDetails("Could not navigate to New List Page");
        Assert.fail();
    }
    return this;
}
10
Saleh Qadan

最初は要素が有効になっていないか、クリックできないようです。そして、あなたの質問に答えるために、はい、あなたが使用できる明示的な待機があり、要素がクリック可能になるのを待機します:

WebDriverWait wait = new WebDriverWait(driver, timeOut);
wait.until(ExpectedConditions.elementToBeClickable(locator));
4
AGill

これを試して、JavaScriptを使用してクリックし、必要に応じて要素の場所を自由に変更してください:-

WebElement element= driver.findElement(By.xpath("YOUR XPATH"));

JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executeScript("arguments[0].click();", element);

それがあなたを助けることを願っています:)

2
Shubham Jain

要素をクリックする前に、要素までスクロールしてみてください。これは主に、Chromeでテストするときに発生します。 JavaScriptExecutorを使用してスクロールできます。

このようなもの:

JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.scrollTo(0," + element.getLocation().Y + ")"); 
2
Prat0567

私はまったく同じ問題に直面していましたが、私のSeleniumライブラリを2.45から2.48.2に更新した後でのみです。 「クリック」メソッドの呼び出しが失敗することはありません。つまり、要素は常にドライバーによって検出されます。つまり、正しい場所をクリックすることで失敗すると思います。私のテストは高解像度の画面で問題なく実行され、低解像度の画面では成功する場合があります(ただし、クリックの問題が原因でほとんど失敗します)。色々試してみましたが、結局私に効いたのはZOOMでした。

テストを実行する前に、次のメソッドを呼び出します。「クリック」メソッドがその低解像度画面で期待どおりに機能するようになりました。

public void zoomOut () {
        WebElement html = driver.findElement(By.tagName("html"));
        html.sendKeys(Keys.chord(Keys.CONTROL, Keys.SUBTRACT));
}
0
Shahzaib Salim

あなたは明示的な待機を試みたと言いますが、あなたが求めていることはfluentWait(明示的な待機のタイプです)によって最もよく達成できるように聞こえます:

public WebElement fluentWait(final By locator) {
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
        .withTimeout(30, TimeUnit.SECONDS)
        .pollingEvery(5, TimeUnit.SECONDS)
        .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
    public WebElement apply(WebDriver driver) {
        return driver.findElement(locator);
    }
});

return  foo; };;

ここで、WebElementはクリックしようとしているボタンになります。 FluentWaitのすばらしい点は、要素が見つかると要素自体が返されることです。ドキュメントから:

オンザフライでタイムアウトとポーリング間隔が構成されている可能性があるWaitインターフェースの実装。各FluentWaitインスタンスは、条件を待機する最大時間と、条件をチェックする頻度を定義します。さらに、ユーザーは、ページ上で要素を検索するときのNoSuchElementExceptionsなど、待機中に特定のタイプの例外を無視するように待機を構成できます。

使用するには、次のようにします。

WebElement newListBtn = fluentWait(By.id("button"));

また試してください:

Driver.SwitchTo().DefaultContent();

フレームの問題に備えて、クリックする前に。

0
marchocolate

セレンはGUIの「ダイナミズム」の欠如に悩まされています。それによって私はあなたがクリックした後にページに更新を送ることをお勧めします。

どうしたの?.

0
e1che

クリックがSeleniumと一致しないことにも気付きましたが、これはある程度既知の問題のようです。

https://github.com/SeleniumHQ/Selenium/issues/4075

私の場合、要素の準備ができていないことはほとんどありません。私は待機していましたが、より重要なことに、私のテストケースは非常に大きなフォームに入力していました。クリックしてドロップダウンを開始するボタンは非常にシンプルで、テストの30分近く前にロードされていることがわかります。それと対話しますが、それでもしばしば失敗します。予想されるドロップダウンが表示されるまで、100ミリ秒ごとにクリックする愚かなwhileループを作成したところまで。

これはすべて推測ですが、そのスレッドでの個人的な遵守と他のユーザーからのコメントから-並列テストを実行しているときにこのような問題に気づいたあるユーザーが言及したように、見逃したイベントの可能性があることを示しているようで、おそらくこれは、そのアーキテクチャから導入された遅延が原因です。具体的には、これを、サイプレスが中間サーバーなしでブラウザーに直接与えられたネイティブコマンドで動作する方法と比較しています。

0
JacksonWong

JavaScript WebDriverを使用しているときに、表面上で同様の問題のように見えるものがありました。click()のプロミスは正常に解決されましたが、何も起こりませんでした。

私の場合、ページ上の無効な画像のsrc属性に関連していることがわかりました(クリックしていたボタンとは関係ありません)。何らかの理由で、画像リンクを修正することで問題は解決しました!

OPがJSではなくJava=を使用していたことは知っていますが、自分の検索でここに来たので、JavaScriptを使用している他の人も同じようになるでしょう。

0
John Rix