如何在 Selenium 中从 Web table 中抓取特定列

How to grab a specific column from a web table in Selenium

我在 C# selenium 中工作,我想从 Web table 中抓取某个专栏进行测试。我很好奇你是否可以使用

row.FindElements(By.TagName("wanted_col_name"));

按名称抓取某列或按列号抓取

Table shown on the webpage

HTML of the site

我特别想从产品线中抓取元素,将它们与零件号组合,然后将字符串放入数组中。此输出的一个示例是

BCA/A1
BCA/A2
PEN/30

当然是DELIVERED BY NOON,但是不知道怎么排除

我现在拥有的代码打印出 table 的每个元素,但是当我尝试仅打印出我想要的列时不起作用,因为它在单个字符串中包含整行并且DELIVERED BY NOON 字符串。

            IWebElement tableElement = driver.FindElement(By.XPath("//*[@id='InvoiceTable']/tbody"));
            IList<IWebElement> tableRow = tableElement.FindElements(By.TagName("tr"));
            IList<IWebElement> rowTD;

            foreach(IWebElement row in tableRow)
            {
                rowTD = row.FindElements(By.TagName("td"));

                foreach (IWebElement col in rowTD)
                {
                    TestContext.WriteLine(col.Text + " ... \n\n");
                }
            }

这段代码可以满足您对 HTML tables 的 W3C 网站的要求,经过测试并可以正常工作:

        driver.Navigate().GoToUrl("https://www.w3schools.com/html/html_tables.asp");

        var table = driver.FindElement(By.Id("customers"));
        var rows = table.FindElements(By.TagName("tr"));

        foreach (var row in rows)
        {
            var tds= row.FindElements(By.TagName("td"));
            if (tds.Count > 2)
                Console.WriteLine("{0}/{1}", tds[0].Text, tds[2].Text);
        }

它的工作原理是选择客户 table,然后将第一列的文本与第三列的文本以与您的示例相同的格式连接起来。

我在 foreach 循环中添加了对 tds.Count 的检查,因为 W3C 演示页面中的第一个 table 行有一个 table header,所以它returns 0 次。

希望对您有所帮助。