Selenium WebDriverでのテストに問題があります。プログラムがボタンをクリックしようとすると、Click
イベントが常に機能するとは限りません。あるテストではすべてが大丈夫ですが、他のテストではそうではありません。
すべてのテストは1ページから始まります。まず、ユーザーはselect
コンポーネントからオプションを選択する必要があります。その後、ユーザーはボタンをクリックします。
私は一度すべてが大丈夫である理由を知りたいのですが、2回目にテストを実行するとそうではないのですか?
ボタンを見つけてクリックするためのソースコードを次に示します。
public void clickContinueBtn() {
webElement = driver.findElement(By.xpath("//div[@class='btn Magenta_s']/a/span"));
webElement.click();
}
私は同様の問題に遭遇しました。クリック方法は他のページでは機能しましたが、特定のページではまったく機能しませんでした。
競合状態が問題の原因です。
button.click
は無効な要素で発生します。そして、何も起こりません。タイミングの問題であることがわかったら、ここで解決策を見つけました: どのようにして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
Javascriptベースの代替方法を使用してクリックすることもできます。このためのコードは次のとおりです。
WebElement element = driver.findElement(By.id("something"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
多くの場合、ブラウザの互換性が原因で発生します(主にfirefoxで)。そのため、「WebElement.sendKeys(Keys.ENTER);」を使用してみてください「webElement.click();」の代わりのコード
タイミングの問題はありませんか?要素を見つける前にブレークポイントを作成し、コードが正常に実行されるかどうかを確認します。タイミングの問題がある場合は、ボタンをクリックする前に明示的な待機を使用してください。また、実際にクリックする前に、ボタンをクリックできるようにする必要があります(要素は表示可能で、有効にする必要があります)。
明示的に待機するソリューションは次のようになります。
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();
以下のコードを試してみてください。意図的に要素にフォーカスを移動している場合があります
WebElement element = driver.findElement("yourElement");
Actions builder = new Actions(driver);
builder.moveToElement(element).click(element);
builder.perform();
数日前に同様の問題を経験し、特定のケースで解決策を見つけました。 === 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待機でこれを解決しました...
推奨される解決策:html構造、xpathを確認し、構文の問題を見つけ、要素にアクセスするさまざまな方法を見つけてください。
Xpathを見ると、ボタンは特定されていませんが、代わりにボタンが存在するspanタグを指していることになります。 Seleniumは、ボタンではなくスパンをクリックします。そのため、click()が機能しません。利用可能な場合はIDまたは名前を使用するか、ボタンパスも含めるようにxpathを変更してください。 htmlを投稿できれば、xpathを簡単に作成できます。 click()は私にとって完璧に機能しており、プロジェクトで1年以上にわたってこの方法を使用しており、それがうまく機能するたびに...