2017-09-07 1 views
0

Ich benutze Selenide/Selenium, um meine Java-Automatisierungsskripte zu schreiben, und vor kurzem stand ich vor einem Problem. Ich möchte ein Element aus derselben Reihe nehmen, das ich mit meinem zweiten Element vergleiche. Html Beispielcode:Element mit CSS-Selektor mit mehreren Elementen in einer Tabelle nehmen

<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> 
... 

Lasst uns vorstellen, dass es viel mehr von denen sein. Und das wichtigste ist, dass diese randomisiert werden können. jedes Mal. Sie hängen von der letzten Seite ab, was ich auswähle und wie.

Also im Grunde möchte ich nach Tests suchen und dass es 8% hat.

Was ich versucht habe, aber ich weiß nicht, was ich damit machen soll. Es speichert alle Elemente in der Liste. Bu Ich bekomme Css-Selektor mit Chrome-Treiberinfo davor. Ich kann es ausziehen, aber ich denke, es gibt viel bessere Lösungen:

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)); 
} 

Ich habe auch versucht, ein Element mit diesem Code zu erhalten:

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(); 
} 

Dieser Code nimmt die „Maske“ und „8 % "Elemente. Aber was ich wirklich will, ist zu testen, ob der getText Wert "Maske" ist, nehmen Sie den Prozentwert und vergleichen Sie ihn. Zum Beispiel: Suchen Sie im Web nach dem Wort "Maske", nehmen Sie den Prozentwert (in diesem Fall ist es 8%) und validieren Sie mit assert, dass es genau 8% ist.

Gibt es eine Möglichkeit CSS-Selektor mit dem Index zu setzen, wie

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

, die für die zweite tr Klasse wählen wird? Irgendwelche anderen Ratschläge zu finden, die ich will?

EDIT: Ist es möglich, das Element mit CSS-Selektor nur eine Zeile mit zu bekommen, wie mit XPath-Option in Antwort zeigte, was @Guy schrieb:

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

Antwort

1

Sie können xpath verwenden Sie das Element mit der Mask Text

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

Xpath Lösungen ist großartig, sauber und einfach, aber ich möchte wirklich CSS für meinen Code verwenden. Wenn es etwas ähnliches in CSS-Ansicht gibt, teilen Sie es bitte – imbasheep

+0

@iljuwka können Sie Text mit 'cssSelctor' finden, etwas wie' "td: enthält (Mask)" 'wenn Speicher dient. Selenium unterstützt dies jedoch nicht, Sie erhalten 'InvalidSelectorException', und' cssSelector' hat nicht den Gegenwert von 'following-sibling'. – Guy

+0

Ja, ich bekam jedes Mal "InvalidSelectorException" -Fehler. Deshalb habe ich gefragt, ob jemand einen Weg finden könnte, es zu lösen. Ich glaube // XPath ist das Beste, was ich verwenden kann – imbasheep

1

Sie mit folgendem CSS-Selektor versuchen können, Es kann dir helfen.

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 

In 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

ich Ihre CSS-Selektor Option mag: „td: last-child“ Es funktioniert, aber es, wenn sonst Bedingungen sind wirklich niedrigen Niveau Lösungen . Ich schaffte es zu bekommen, was ich wollte. Deine Antwort ist die gleiche wie @ Pankaj Sharma, aber dein cleaner Code-Stil ist niedrig. Wenn sonst die Anzahl der Anweisungen für Assert geändert wird, ist es das. Aber ich bin wirklich dankbar für Ihre CSS-Lösungen. Von nun an werde ich versuchen, deine zu benutzen. – imbasheep

+0

Gibt es eine Möglichkeit, mit CSS-Selektor zu überprüfen, wenn das tr-Element Mask enthält und es Kind, das 8% in einer Zeile ist, erhalten? – imbasheep

1

Mit CSS und Java, können wir es als ausführen:

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% 
    } 
} 

Alternativ Wenn Sie XPath verwenden, können Sie es durch einen Vergleich der Text erreichen können von '//tr[@ng-repeat='testing']/td[contains(text(),'Mask')]/../td[3]' locator

+0

Ich denke, das wird nicht helfen, aufgrund Ihrer Behauptung dauert das zweite Element, das in diesem Fall "5%" sein wird, wenn ich mich nicht irre. In meinem Fall alle Elemente werden jedes Mal zufällig so Ihre for-Schleife die richtige nicht finden, aber dann brauche ich, dass und es zu verwenden, sich daran zu erinnern mit einem anderen for-Schleife zu finden, die in gefunden suchen jetzt wird – imbasheep

+0

dieses Stück einfügen Code innerhalb einer Funktion übergeben das erste Argument als 'Text in der ersten Spalte' und als 'zu überprüfenden Text'. In der for-Schleife durchläuft es die Elemente. Wenn das spezifische Element den Text enthält (z. B. Maske), wird es weiterhin diese bestimmte Zeile haben und erhält die dritte Spalte (z.B. '8%'). P.S. Ich habe den Code aktualisiert –

+0

Ihr arbeitet wirklich gut, danke. Es ist ähnlich wie @ Murthi Antwort, aber Ihre ist sauberer und verständlicher. Einzige Sache, die Sie foreach verwenden können. – imbasheep

0

Wie Sie 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% wollen ausfindig zu machen, können Sie eine Funktion erstellen, die 8%Mask und dem Text 2-String-Typ von Argumenten das heißt der Text statt. Rufen Sie von der Klasse main() oder test() die Funktion auf, die die Parameter bereitstellt. In der aufgerufenen Funktion können wir den Text abrufen und den Prozentsatz leicht bestätigen.Ihr Code wird aussehen wie:

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

Das gleiche hier, all das kann reduziert werden, was @Guy in seiner Antwort geschrieben hat. – imbasheep

0

Versuchen Sie, diese

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

All dies kann auf das reduziert werden, was @Guy geschrieben hat – imbasheep

Verwandte Themen