【问题标题】:Selecting row from Table - Java Selenium从表中选择行 - Java Selenium
【发布时间】:2016-10-29 19:51:23
【问题描述】:

我有一个快速的 Java 表格问题。我有一个表,包含 4 列和 X 行。该列如下:报价编号、名称、日期和添加按钮。 我正在尝试,在表格中查找特定名称后,单击找到该名称的行上的添加按钮。

例子:

Quote#  Name       Date        Add-Button

100001  John Doe1  01/01/1980  [Add]
100002  John Doe2  01/01/1981  [Add]
100003  John Doe3  01/01/1982  [Add]
100004  John Doe4  01/01/1983  [Add]

我编写了以下代码,以识别某个名称是否在表中:

public List<String> getInternetQuoteNames()
    {
        List<WebElement> webName = sh.getElements(newInternetQuotesNames);
        List<String> stringName = new ArrayList<>();
        for(WebElement name : webName)
            stringName.add(name.getText());
        return stringName;
    }

现在我正在尝试编写另一种方法来单击正确的 [添加] 按钮,但我不确定如何访问正确的行,因为我不擅长使用表格。到目前为止我写的是:

public void addInternetQuoteByName(String name)
    {
        List<String> listOfNames = getInternetQuoteNames();
        if(listOfNames.contains(name))
        {
            // Find row of provided name
           // Click on [Add]-button on that row
        }
    }

表格的HTML代码如下:

<tbody>
    <tr>
        <td>100040365822</td>
        <td>Test06232016 Test033929</td>
        <td>06/23/2016</td>
        <td>
            <a id="assignQuoteLink_100040365822" class="add_from_pqs" href="#">Add Quote</a>
        </td>
    </tr>
    <tr class="alt">
        <td>100040365772</td>
        <td>Test06232016 Test033723</td>
        <td>06/23/2016</td>
        <td>
            <a id="assignQuoteLink_100040365772" class="add_from_pqs" href="#">Add Quote</a>
        </td>
    </tr>
    <tr>
        <tr class="alt">
            <tr>
                <tr class="alt">
</tbody>

非常感谢任何有关如何完成该方法并单击右侧行的 [添加] 按钮的提示!

【问题讨论】:

  • 请向我们展示您正在使用的 HTML 代码...
  • @mo-h,我添加了 HTML
  • 从确定要查找的名称所在的行开始,@mo-h
  • 我调用 addInternetQuoteByName("John Doe");方法,我想找出名字是在哪一行找到的
  • 为什么不直接findElement( By.xpath( '//tr/td[contains(.,'John Doe2')]/../a' ).click();

标签: java selenium html-table row


【解决方案1】:

这个要求听起来很像这篇文章。 http://www.testautomationguru.com/selenium-webdriver-finding-webelements-using-map/


基本上,您需要插入一些 javascript 来创建如图所示的结构。

{
    "John Doe1": {
        "Add" : []
    },
    "John Doe2": {
        "Add" : []
    }   

}

然后获取返回的结果并将 caste 输入到 Map。

Map < String, WebElement >> nameMap = ((JavascriptExecutor) driver).executeScript(queryString);

那么你的用法会是这样的

nameMap.get("John Doe3").get("Add").click();

【讨论】:

    【解决方案2】:

    试试这个方法:

    1. 获取表格大小driver.findElements(By.xpath("table xpath")).size()
    2. 遍历表中的每个名称记录,并查找是否在输入中找到匹配项。
    3. 点击添加按钮。

    代码

    public static void addInternetQuoteByName(String Name) 
    {
        WebDriver driver = new FirefoxDriver();
        int rowCount = driver.findElements(By.xpath("xpath of table")).size();
    
        for (int i = 1; i <= rowCount; i++) 
        {
            String sCellValue = driver.findElement(By.xpath("XPATH Of Name row")).getText();
    
            if (sCellValue.equalsIgnoreCase(Name)) 
            {
                 driver.findElement(By.xpath("xpath of add")).click();
            }
        }
    
        driver.close();
    }
    

    名称和添加按钮的 xpath 必须传递为使 tr[i]dynamic 例如:.//*[@id='content']/table/tbody/tr["+i+"]/td[2]

    由于我不确定名称和添加按钮列的确切 xpath,我提供了一个示例。

    如果您有问题,请告诉我。

    【讨论】:

    • 请忽略“driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);”这一行
    • 编辑您的答案并自己删除该行。您还应该花几分钟正确地格式化您的代码以使其可读。
    【解决方案3】:

    这是执行您要求的功能。它抓取所有 TR,在第二个单元格 (TD) 中查找名称,如果找到,则单击该行的“添加引用”链接。

    public void addByName(String name)
    {
        List<WebElement> rows = driver.findElements(By.tagName("tr"));
        for (WebElement row : rows)
        {
            List<WebElement> cells = row.findElements(By.tagName("td"));
            if (cells.get(1).getText().equals(name))
            {
                cells.get(3).findElement(By.linkText("Add Quote")).click();
                return;
            }
        }
    }
    

    【讨论】:

    • 如果页面中有多个表格,上面的代码将不起作用!使用标记名不是最好的方法。
    • @prithvi394 是的,但是没有提供足够的信息来指定一个表,并且没有提供多个表的信息,所以......这行得通。它也可以很容易地在rows 中进行调整,以仅获取特定表的 TR。使用 XPath 有更好/更快的方法来做到这一点,但现在发布它没有多大意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多