2017-09-07 31 views
0

私はJavaの自動化スクリプトを書くためにSelenide/Seleniumを使用していますが、最近問題が発生しました。私は同じ行から要素を取りたいと思います。私は2番目の要素を比較します。 のHTMLコード例は:テーブル内の複数の要素を持つcssセレクタで要素を取る

<tr ng-repeat="testing" class="ng-scope" style=""> 
    <td class="ng-binding">Style</td> 
    <td ng-if="testing2" class="ng-binding ng-scope">1</td> 
    <td class="ng-binding">5%</td> 
</tr> 
<tr ng-repeat="testing" class="ng-scope" style=""> 
    <td class="ng-binding">Mask</td> 
    <td ng-if="testing2" class="ng-binding ng-scope">2</td> 
    <td class="ng-binding">8%</td> 
</tr> 
... 

のは、それらのはるかがあるだろうと想像してみましょう。そして最も重要なのは、これらが無作為化できるということです。毎回。彼らは私が選んだものと方法を最後のページに依存します。

基本的に私はテストを検索したいと思っており、それは8%です。

私が試したことはありますが、どうしたらいいのか分かりません。リスト内のすべての要素を格納します。私はそれの前にクロムのドライバ情報とCSSセレクタを取得する。私はそれを取ることができますが、私ははるかに良い解決策があると思う:

int counter = $$(By.cssSelector("tr > [class='ng-binding']")).size(); 
for (int i = 0; i < counter; i++) { 
SelenideElement word= $$(By.cssSelector(lokaator)).get(counter); 
word.getText(); 
} 

このコードは、「マスク」をとり、「8:私もこのコードで要素を取得しようとしました

List<WebElement> list = getWebDriver().findElements(By.cssSelector("[ng- 
repeat='hyvitisLiik in vm.taotluseHyvitised'] > [class='ng-binding']")); 
for(int i = 0; i < list.size(); i++){ 
    logger.info(list.get(1)); 
} 

% "要素。 しかし、私が本当に欲しいのは、getTextの与えられた値が "マスク"で、パーセント値をとり、それを比較すればテストです。 例:Webで単語「マスク」を検索し、パーセント値(この場合は8%)をとり、正確に8%であることをアサートして検証します。

は、第二のTRクラスを選択します

tr[1] > [class='ng-binding'] 

のように、インデックスにCSSセレクタを設定する方法はありますか?私が欲しいと思う他のアドバイスはありますか?

EDIT: は@Guyを書いたものを解答でXPathオプションで示したよう一列のみを使用してCSSセレクタで要素を取得することが可能です:

WebElementelement=getWebDriver().findElement(By.xpath("//td[text()='Mask']/followingsibling::td[2]")); 
element.getText(); // 8% 

答えて

1

あなたがsearch in web for the word "Mask", take the percent value (in that case it is 8%) and validate with assert that it is exactly 8%にしたいと、あなたはすなわち、テキストMaskとテキスト8%引数の2文字列型を取る関数を作成することができますMaskテキスト

WebElement element = getWebDriver().findElement(By.xpath("//td[text()='Mask']/following-sibling::td[2]")); 
element.getText(); // 8% 
+0

xpathソリューションは素晴らしい、きれいでシンプルですが、私は本当に自分のコードにCSSを使いたいと思っています。もしcssビューに類似のものがあれば、それを共有してください。 – imbasheep

+0

@iljuwka 'cssSelctor'を使ってテキストを見つけることができます。' 'td:contains(Mask)' 'のようなものです。しかし、Seleniumはこれを使用することをサポートしていません。あなたは 'InvalidSelectorException'を取得し、' cssSelector'は 'following-sibling'に相当するものを持っていません。 – Guy

+0

はい、私は毎回 "InvalidSelectorException"エラーを受けていました。だからこそ、誰かがそれを解決するかどうか尋ねたのです。 私は// xpathが使えると思っています – imbasheep

1

あなたは、以下のCSSセレクタを試すことができ、それはあなたを助けるかもしれません。 Javaでは

table>tr:nth-child(2)>td ---- To get the first td element of second row 

table>tr:nth-child(2)>td:nth-child(3) --- To get last td element of second row 

、CSSおよびJavaを使用した

List<WebElemet> lstRows=getWebDriver().findElements(By.cssSelector("table>tr[ng-repeat='testing']"); 

for(WebElement row:lstRows){ 
    if(row.findElement(By.cssSelector("td")).getText().equals("Mask")){ 
    { 
    String percentage= row.findElement(By.cssSelector("td:last-child")).getText(); 
    if(percentage.equals("8%") 
    System.out.println("pass"); 
    else 
    System.out.println("fail"); 
    break; 
    } 
} 
+0

をお試しください。 私は自分が望むものを手に入れました。あなたの答えは@Pankaj Sharmaが書いたのと同じですが、クリーンなコードスタイルは低いです。もしAssertのelse文の数が変更されれば、それだけです。 しかし、私はあなたのCSSソリューションに本当に感謝しています。これから私はあなたのものを使用しようとします。 – imbasheep

+0

tr要素にマスクが含まれていて、1行で8%の子を取得すると、cssセレクタで確認する方法はありますか? – imbasheep

1

、我々はとしてそれを実行することができます。また

List<WebElement> elements = getWebDriver().findElements(By.cssSelector("tr[ng-repeat='testing']")); 
    for(int i = 0; i < elements.size(); i++) { 
     if(elements.get(i).findElement(By.cssSelector("td")).getText().contains("Mask")) { 
      //assert elements.get(i).findElements(By.cssSelector("td")).get(2).getText() equals 8% 
    } 
} 

あなたはXPathを使用している場合、あなたはテキストを比較することによって、それを達成することができます '//tr[@ng-repeat='testing']/td[conss(text(),'Mask')]/../td[3]'ロケータ

+0

私は間違いではない場合、この場合はあなたの主張が助けにならないと思いますが、この場合は「5%」になる第2の​​要素を取ると思います。 は、私の場合、すべての要素は、ので、あなたのforループは、右を見つけるん毎回ランダム化されているが、その後、私はことを覚えていると、この作品を貼り付けた – imbasheep

+0

になりました検索しますforループを別と​​を見つけるためにそれを使用する必要があります最初の引数を '最初の列の中にあるテキスト'、2番目を '検証する文字列'として渡します。 forループでは、要素を走査します。特定の要素にテキスト(例:マスク)が含まれている場合は、その特定の行を引き続き持ち、3番目の列(「8%」など)を取得します。 P.S.私はコードを更新しました –

+0

あなたの1つは実際にうまく動作しています、ありがとう。これは@ Murthiの答えに似ていますが、あなたの方がよりきれいで理解できるものです。 foreachを使用できるのはあなただけです。 – imbasheep

0

を使用して要素を検索するためにxpathを使用することができます。 main()またはtest()クラスから、パラメータを提供する関数を呼び出します。呼び出された関数では、テキストを取得してパーセントを簡単にアサートすることができます。あなたのコードは次のように見ていることになります。それ以外の条件は本当に低レベルのソリューションであれば それが動作しますがあります:「最後の子TD:」

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.chrome.ChromeDriver; 
import org.testng.Assert; 

public class Q46088968_validate_score 
{ 
    static WebDriver driver; 
    public static void main(String[] args) 
    { 
     System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe"); 
     driver = new ChromeDriver(); 
     driver.get("https://www.gmail.com"); 
     //other actions 
     validate_score("Mask", "8%"); 
     driver.quit(); 
    } 

    public static void validate_score(String my_text, String expected_percentage) 
    { 
     String actual_percentage = driver.findElement(By.xpath("//td[.='" + my_text + "']//following::td[2]")).getText(); 
     Assert.assertEquals(actual_percentage, expected_percentage); 
    } 
} 
+0

同じですが、これはすべて、@ Guyが彼の答えに書いたものを減らすことができます。 – imbasheep

0

は、私はあなたのCSSセレクタのオプションを好むこの

List<WebElement> elements = getWebDriver().findElements(By.xpath("//td[text()='Mask']/../td[3]")); 

    int pass = 0; 
    for(WebElement e | elements) { 
     if(!(e.getText().equals("8%"))) { 
      pass = 1 
     } 
    } 

    if(pass == 0) { 
System.out.println("Pass"); 
} 
else { 
System.out.println("Fail"); 
} 
+0

これは@Guyが書いたものにすべて縮小できます – imbasheep

関連する問題