web-dev-qa-db-ja.com

Click()メソッドは常に機能するとは限りません

Selenium WebDriverでのテストに問題があります。プログラムがボタンをクリックしようとすると、Clickイベントが常に機能するとは限りません。あるテストではすべてが大丈夫ですが、他のテストではそうではありません。

すべてのテストは1ページから始まります。まず、ユーザーはselectコンポーネントからオプションを選択する必要があります。その後、ユーザーはボタンをクリックします。

私は一度すべてが大丈夫である理由を知りたいのですが、2回目にテストを実行するとそうではないのですか?

ボタンを見つけてクリックするためのソースコードを次に示します。

public void clickContinueBtn() {    
    webElement = driver.findElement(By.xpath("//div[@class='btn Magenta_s']/a/span"));
    webElement.click(); 
}
27
user1494328

私は同様の問題に遭遇しました。クリック方法は他のページでは機能しましたが、特定のページではまったく機能しませんでした。

競合状態が問題の原因です。

  1. HTMLコンテンツは、ボタンを無効にしてレンダリングされます。
  2. Selenium Webドライバースクリプトは、javascript onload イベントがトリガーされる前に実行されました(または実行が終了しました)button.clickは無効な要素で発生します。そして、何も起こりません。
  3. 次に、javascript onloadイベントがトリガー(または実行の終了)し、javascriptがボタンを有効にします。
  4. ページを見ると、ボタンが検査時に有効になっているように見えたため、コードが機能しなかった理由がわかりませんでした。手動でボタンをクリックしても機能しました。

タイミングの問題であることがわかったら、ここで解決策を見つけました: どのようにしてSelenium Web Driverが要素が存在するだけでなく、アクセス可能になるのを待つことができますか?

Rubyでソリューションを言い換えるには:

//This will not return the button until it is enabled.
button = driver.find_element(:xpath,  "//button[@id='myButtonId' and not(@disabled)]")
button.click
24
Walker D

Javascriptベースの代替方法を使用してクリックすることもできます。このためのコードは次のとおりです。

WebElement element = driver.findElement(By.id("something"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
17
Arek

多くの場合、ブラウザの互換性が原因で発生します(主にfirefoxで)。そのため、「WebElement.sendKeys(Keys.ENTER);」を使用してみてください「webElement.click();」の代わりのコード

3
Rakesh Gajarmal

タイミングの問題はありませんか?要素を見つける前にブレークポイントを作成し、コードが正常に実行されるかどうかを確認します。タイミングの問題がある場合は、ボタンをクリックする前に明示的な待機を使用してください。また、実際にクリックする前に、ボタンをクリックできるようにする必要があります(要素は表示可能で、有効にする必要があります)。

明示的に待機するソリューションは次のようになります。

By by = By.xpath("//div[@class='btn Magenta_s']/a/span");
WebDriverWait w = new WebDriverWait(driver, timeout);
WebElement element = w.waitUntil(ExpectedConditions.elementToBeClickable(by);
element.click();
2
loother

以下のコードを試してみてください。意図的に要素にフォーカスを移動している場合があります

WebElement element = driver.findElement("yourElement");
        Actions builder = new Actions(driver);
        builder.moveToElement(element).click(element);
        builder.perform();
1
Jitesh Lakhwani

数日前に同様の問題を経験し、特定のケースで解決策を見つけました。 === Selenium Webdriverを使用して、「First Link」のリンクをクリックすると、ページにコンテンツがロードされます。

私の場合と同様に構造を持つコードの一部の下:

_<li class="first-link">
    <a class="common-style" href="javascript:;" style="padding-left: 15px; padding-right: 15px;">First Link</a>
</li>
_

===その結果、Webelementが検出されてクリックされるはずですが、UIに切り替えても何も起こらず、エラーもスローされません(要素が見つからない、要素がクリックできない、要素が無効など)。

いくつかの異なる方法でリンクを見つけることを試みた後(xpathとcss、私の場合は一意のidがないためidで試行しませんでした)、次の値のcssでSelenium Webdriverの要素にアクセスしてクリックできました:_li.first-link a_。ただし、次の値を使用してxpathでアクセスしようとすると、これはFirefoxで「見つかりました」が、クリックは機能しませんでした:.//li[a/text()='First Link']

この問題はわずかなxpath構文の問題であり、Firefoxのfirebugはまったく報告せず、実際にはリンクを見つけました。

中括弧の順序を次のように変更しました:.//li/a[text()='First Link']これで期待どおりに動作し、最初のリンクが見つかりクリックされ、ページをロードするjavascriptコードが実行されます。

私の調査結果は次のとおりです。*タイミングの問題ではないので、準備ができていない要素をクリックしようとするため、これは発生しません。そうでなければ、明示的なSelenium待機でこれを解決しました...

  • 問題は、要素が見つかったということではなく、javascriptが起動されないことです。 JavaScriptコードを直接実行し、手動でイベントを発生させて、これが機能しないことを確認できます。
  • この問題はFirefox 22で発生し、おそらくこのブラウザの古いバージョンで機能します。これがIEまたはChromeで機能する場合、情報を提供することはできません。問題自体は、xpath firefoxで構文の競合がある場合でも例外をスローしないため、何も問題がないと思われます。あなたのコードで、しかしあります。
  • これは、Firefoxの予期しない未処理の動作です。これについて報告されたバグを見つけました: http://code.google.com/p/Selenium/issues/detail?id=4757

推奨される解決策:html構造、xpathを確認し、構文の問題を見つけ、要素にアクセスするさまざまな方法を見つけてください。

0
Romita Dinda

Xpathを見ると、ボタンは特定されていませんが、代わりにボタンが存在するspanタグを指していることになります。 Seleniumは、ボタンではなくスパンをクリックします。そのため、click()が機能しません。利用可能な場合はIDまたは名前を使用するか、ボタンパスも含めるようにxpathを変更してください。 htmlを投稿できれば、xpathを簡単に作成できます。 click()は私にとって完璧に機能しており、プロジェクトで1年以上にわたってこの方法を使用しており、それがうまく機能するたびに...

0
Vinay