2016-09-25 23 views
1

私はセレニウムウェブドライバ3.0を使用していて、開いている2つのダイアログからアクティブダイアログからOKボタンをクリックしたいフォアグラウンドで)。私はどのようにフォアグラウンドのダイアログボックスOKボタンをクリックして親divからhtmlの下に移動できますか? nth-childとnth-of-typeを使ってみましたが、クリックは常に最初のダイアログがバックグラウンドで表示され、Webドライバは[OK]ボタンへのクリックに失敗します。Selenium WebドライバがフォアグラウンドダイアログのOKボタンをクリックしてバックグラウンドダイアログのOKボタンを見つけられません

we.isDisplayed()をチェックすると、最初のOKボタンも見つけられます。私は2番目のダイアログのOKボタンのwe.isDisplayed()メソッドが必要です。

HTML:

<div id="z_shell" class="DwtShell"> 

    <div id="Dialog1" class="DwtDialog"> 
     <td id="ErrorDialog_button1_title" class="ZWidgetTitle">OK</td> 
     <td id="ErrorDialog_button2_title" class="ZWidgetTitle">Cancel</td> 
    </div> 

    <div id="Dialog2" class="DwtDialog"> 
     <td id="ErrorDialog_button2_title" class="ZWidgetTitle">OK</td> 
    </div> 

</div> 

注:ダイアログのdiv idは何をすることができますが、クラス名が固定されている:DwtDialog。

しようとしましたコード:

WebDriver webDriver; 
WebElement we = webDriver.findElement(By.cssSelector("div[class='DwtDialog']:nth-child(2) td[id$='_button2_title']:contains('OK')")); 
visible = we.click(); 
// Click fails here 

しようとしましたロケータ:

By.cssSelector("div[class='DwtDialog']:nth-child(2) td[id$='_button2_title']:contains('OK')") 

By.xpath("//div[@class='DwtDialog'][2]//td[@id='ErrorDialog_button2_title' and contains(text(), 'OK')]") 

By.xpath("//div[@id='z_shell']//div[@class='DwtDialog'][2]//td[@id='ErrorDialog_button2_title' and contains(text(), 'OK')]") 

問題:

がどのように表示されているダイアログの[OK]ボタンをクリックすることができますか?ほとんどの場合、このダイアログは後で読み込まれます。私はnth-child(2)を意味し、第3ダイアログnth-child(3)はヒントとして意味します。

お読みいただきありがとうございます!

+0

ダイアログのタイトルや情報メッセージに頼って別の戦略を試すことはできますか? (HTMLのこの部分はスクリーンショットで展開されていません) – alecxe

+0

コメントありがとうございました。クラス名のみが固定され、アクティブでなければなりません。残りはバックグラウンドになります。 –

+0

内側のIDを使用します。内側のdivのtrやidのようにします。 – lauda

答えて

1

EDIT: idの変更についてのコメントがありませんでした。私はこのようなものはうまくいくはずだと思うが、私はページなしでテストすることはできない。基本的には、div.DwtDialogのダイアログですべてのボタンtd.ZWidgetTitleを取得します。表示され、「OK」を含む場合は、それをクリックします。

List<WebElement> dialogButtons = driver.findElements(By.cssSelector("div.DwtDialog > td.ZWidgetTitle")); 
for (WebElement dialogButton : dialogButtons) 
{ 
    if (dialogButton.isDisplayed() && dialogButton.getText().equals("OK")) 
    { 
     dialogButton.click(); 
     break; 
    } 
} 

EDIT 2:

の詳細情報を取得した後、ここでは別のアプローチがあります。このサイトがサイトにアクセスしなくても機能するかどうかは分かりませんが、うまくいけば正しい方向に向けるでしょう。これにより、エラーダイアログですべてのOKボタンが表示されます。問題は、どちらがクリック可能かです。スローされない例外が見つかるまで、他の要素がクリックを受け取ったときにスローされる例外を食べることができます。それは正しいものです。私はいくつかのローカルテストを行い、このコードは私のために働くようです。

List<WebElement> dialogButtons = driver.findElements(By.xpath("//td[starts-with(@id, 'ErrorDialog_button') and text()='OK']")); 
System.out.println(dialogButtons.size()); 
System.out.println(dialogButtons.size()); 
for (WebElement dialogButton : dialogButtons) 
{ 
    try 
    { 
     dialogButton.click(); 
    } 
    catch (WebDriverException e) 
    { 
     // do nothing 
    } 
} 
+0

divのidが問題のノートに記載されているように変更されているようですが、クラスが使用されている場合は、ページの位置として2番目のdivの最初のボタンをクリックする必要がある場合はエラーをスローします。 – lauda

+0

@laudaうん、私は最初にそのメモを逃した...私はちょうど私の答えを更新しました。 – JeffC

+0

ありがとうJeff、あなたの答えは間違いなく役に立ちますが、それは私に0要素を与えます。私はCSSを修正する必要があると思う。私はdiv.DwtDialog> td#ErrorDialog_button2_titleを試しましたが、それもうまくいきません。私たちは行方不明のものはありますか? –

関連する問題