2016-08-08 17 views
0

行にテキストが含まれていて、その行のセルをクリックすると、私は言いたい表があります。List WebElementの子を選択 - Java - Selenium WebDriver

私は行のリストを作成しようとしていますが、各行の列を繰り返し、その行にテキストがある場合は、セルをクリックして次のような項目の選択を解除します(明らかに機能しません。単に論理を理解しようとしている)。

// Deselect Pending Quality Review 
List<WebElement> parents = driver.findElements(By.cssSelector("tr[type='row']")); 
for(WebElement parent : parents) 
{ 
    List<WebElement> children = parent.findElements(By.cssSelector("td[class='grdCell']")); 
    for(WebElement child : children) 
    { 
     if (parent.getText().contains("Pending Quality Review") && child.getAttribute("style").contains("visible")) 
     { 
      System.out.println("Deselect Pending Quality Review"); 
      child.click(); 
     } //end if 
    } // end child for loop 
} // end for parent element 

ここでは、私が扱っているHTMLの例を示します。最初の行には2つの選択ボックスがあり、2つ目の行にはimgタグの示す1つしかありません。

<tr type="row" adr="14" tag="" id="x:1011327536.13:adr:14:tag:"> 
    <td type="cell" adr="0" idx="0" class="grdCell">Cancelled</td> 
    <td class="ig9a63765d">1</td> 
    <td class="ig9a63765e">1</td> 
    <td type="cell" adr="3" idx="3" class="grdCell"> 
     <img id="ctl00_ctl00_ctl00_Main_Main_Main_gridStatusSyncMappings_it3_14_imgSync" src="Images/BlueArrowLeft32x32.png" alt="" style="visibility:visible;"></td> 
    <td class="ig9a63765f">1</td> 
    <td class="ig9a637660">1</td> 
    <td class="grdCell"> 
     <img id="ctl00_ctl00_ctl00_Main_Main_Main_gridStatusSyncMappings_it6_14_imgSync" src="Images/BlueArrowRight32x32.png" alt="" style="visibility:visible;"></td> 
    <td type="cell" adr="7" idx="7" class="grdCell">Cancelled</td> 
    <td class="ig9a637661">300020</td> 
    <td class="ig9a637662">1</td> 
    <td class="ig9a637663">1</td> 
    <td class="ig9a637664">1</td> 
    <td class="ig9a637665"></td> 
    <td class="ig9a637666">1</td> 
    <td class="ig9a637667"></td> 
</tr> 

<tr type="row" adr="15" tag="" id="x:1011327536.13:adr:15:tag:" class="ig_ListAlt igg_ListAlt "> 
    <td type="cell" adr="0" idx="0" class="grdCell">Pending Quality Review</td> 
    <td class="ig9a63765d">1</td> 
    <td wlkd="1" type="cell" idx="2" adr="2" class="ig9a63765e">1</td> 
    <td wlkd="1" type="cell" adr="3" idx="3" class="grdCell"> 
     <img id="ctl00_ctl00_ctl00_Main_Main_Main_gridStatusSyncMappings_it3_15_imgSync" src="Images/BlueArrowLeft32x32.png" alt="" style="visibility: visible;"> 
    </td> 
    <td class="ig9a63765f">0</td> 
    <td class="ig9a637660">0</td> 
    <td type="cell" adr="6" idx="6" class="grdCell grdCell_CursorDefault grdCell_Gray grdCell"></td> 
    <td type="cell" adr="7" idx="7" class="grdCell">Pending Quality Review</td> 
    <td class="ig9a637661">301002</td> 
    <td wlkd="1" type="cell" idx="9" adr="9" class="ig9a637662">1</td> 
    <td class="ig9a637663">0</td> 
    <td class="ig9a637664">1</td> 
    <td class="ig9a637665"></td> 
    <td class="ig9a637666">1</td> 
    <td class="ig9a637667"></td> 
</tr> 

は、したがって、この例では、私は保留品質レビューの行を選択する必要があることだし、セルのIMGが見える含まれている場合は、それをクリックしてください。

将来、行がキャンセルされた場合は、2番目のオプションのみを選択すると、私は行の途中で何かする必要があるかもしれません。それを行う方法の詳細も参考になります。

答えて

0
if (parent.getText().contains("Pending Quality Review") && ***child.getAttribute("style").contains("visible")***) 

子Web要素がtdで、スタイル 'visibilty:visible'が含まれていないため、何もクリックされません。

List<WebElement> children = parent.findElements(By.cssSelector("***td[class='grdCell']***")); 

この属性を取得するには、imgレベルに移動する必要があります。

さらに、parent.getText.containsの部分を確認できますか、正しく動作しますか?私が推測しているように私の知る限りでは、すべての子どものテキストとテキストを検索して統合テキストを取得しようとしています。

ロケータを使用する代わりの方法... 次の表に境界線を追加してコードを貼り付けてコピーします。 テーブル上のロケータに基づいているため、正しく表示されますか。

- あなたが表示されているすべての画像を収集するには、次のロケータを使用することができます「保留品質レビュー」テキストでの行を選択する(画像を添付してどうにかできない、リンクを置く)

http://i.stack.imgur.com/mDxcP.png

"//td[@class='grdCell'][text()='Pending Quality Review'][1]/following-sibling::td[3]/img[contains(@style,'visible')]" 

これで、クリックできる画像のリストが表示されます。落とし穴の

キャンセルテキストの行を選択するための可視第2の画像をクリックする---

"//td[@class='grdCell'][text()='Cancelled'][1]/following-sibling::td[6]/img[contains(@style,'visible')]" 

一つは、テーブルが列をシフトすることによって再構築されている場合、このアプローチは失敗することです。 imgタグに一意のクラスを追加すると、その番号は2番目のtdから削除できます。

関連する問題