0

我正在使用 Selenide/Selenium 编写我的 java 自动化脚本,最近我遇到了一个问题。我想从我比较第二个元素的同一行中获取一个元素。html示例代码:

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

我试过了,但我不知道该怎么办。它将所有元素存储在列表中。Bu 我在它之前得到了带有 Chrome 驱动程序信息的 css 选择器。我可以脱掉它,但我认为有更好的解决方案:

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

我还尝试使用以下代码获取元素:

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%”元素。但我真正想要的是测试 getText 给定值是否为“掩码”,取百分比值并进行比较。例如:在网络上搜索单词“Mask”,获取百分比值(在这种情况下为 8%)并通过断言验证它恰好是 8%。

有没有办法用索引设置 CSS 选择器,比如

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

哪个将选择第二个 tr 类?找到我想要的任何其他建议?

编辑: 是否可以仅使用一行来获取带有 css 选择器的元素,如 xpath 选项所示,回答@Guy 所写的内容:

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

5 回答 5

1

您可以尝试使用以下 css 选择器,它可能会对您有所帮助。

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

在 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;
  }
}
于 2017-09-07T06:43:24.617 回答
1

使用 CSS 和 Java,我们可以将其执行为:

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[contains(text(),'Mask')]/../td[ 3]'定位器

于 2017-09-07T06:52:45.947 回答
1

您可以使用文本xpath来定位元素Mask

WebElement element = getWebDriver().findElement(By.xpath("//td[text()='Mask']/following-sibling::td[2]"));
element.getText(); // 8%
于 2017-09-07T06:55:14.000 回答
0

如您所愿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%,您可以创建一个函数,该函数将采用 2 个字符串类型的参数,即文本Mask和文本8%。从main()ortest()类调用提供参数的函数。在被调用的函数中,我们可以轻松地检索文本并断言百分比。您的代码将如下所示:

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);
    }
}
于 2017-09-07T10:09:38.043 回答
0

试试这个

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");
}
于 2017-09-07T15:25:42.150 回答