36

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

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

一度はすべて問題なく、2 回目にテストを実行すると問題が発生する理由を知りたいのですが。

ボタンを見つけてクリックするソースコードは次のとおりです。

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

9 に答える 9

28

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

競合状態が問題の原因でした:

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

それがタイミングの問題であることがわかったら、ここで解決策を見つけました: How can I get Selenium Web Driver to wait for a element to access, not just present?

Ruby でのソリューションを言い換えると、次のようになります。

//This will not return the button until it is enabled.
button = driver.find_element(:xpath,  "//button[@id='myButtonId' and not(@disabled)]")
button.click
于 2013-02-03T10:30:38.810 に答える
25

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

WebElement element = driver.findElement(By.id("something"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", element);
于 2012-08-28T13:23:28.527 に答える
3

以下のコードを試してみてください。意図的に要素に焦点を合わせている場合があります。

WebElement element = driver.findElement("yourElement");
        Actions builder = new Actions(driver);
        builder.moveToElement(element).click(element);
        builder.perform();
于 2017-12-01T06:36:00.850 に答える
0

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

于 2013-07-31T01:11:08.763 に答える
-2

これの考えられる理由の1つは、メソッドがすべての要素にイベントclick()をディスパッチできないことである可能性があります。click

clickしたがって、クリックしようとしている要素に対して明示的にイベントを発生させることができます。

于 2012-08-28T13:17:45.890 に答える