好的,我创建了一个 NUnit 测试项目并添加了 Selenium.WebDriver 和 Selenium.WebDriver.ChromeDriver NuGet 包。我在项目中添加了一个名为 page.html 的文件,将其“复制到输出目录”属性设置为“始终复制”并添加了以下标记 - 这只是为了让我有一个可以使用的页面。
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body>
<table id="myTable">
<thead>
<tr><td>0</td><td>0</td></tr>
</thead>
<tbody>
<tr><td>1</td><td>1</td></tr>
<tr><td>2</td><td>2</td></tr>
<tr><td>3</td><td>3</td></tr>
<tr><td>4</td><td>4</td></tr>
<tr><td>5</td><td>5</td></tr>
<tr><td>6</td><td>6</td></tr>
</tbody>
</table>
</body>
</html>
这是我的测试:
namespace StackOverflow68649351RandomRow
{
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.IO;
public class Tests
{
[Test]
public void Test1()
{
IWebDriver driver = new ChromeDriver();
try
{
var path = Directory.GetCurrentDirectory();
driver.Navigate().GoToUrl($"file://{path}/page.html");
// Get the table by ID - don't want to assume that it's the only table on the page
var table = driver.FindElement(By.Id("myTable"));
// Get all the rows in the table
var rows = table.FindElements(By.TagName("tr"));
// pick a random row
var random = new Random();
var rowNumber = random.Next(rows.Count - 2) + 1; // use this line to exclude the header row
// var rowNumber = random.Next(rows.Count - 1); // use this line to include the header row
var row = rows[rowNumber];
// Do something with the row
Console.WriteLine(row.Text);
}
finally
{
driver.Quit();
}
}
}
}
那么这里发生了什么?
Directory.GetCurrentDirectory() 返回项目输出文件夹的路径,这是编译器将我的 page.html 文件复制到的位置,因此我可以在下一行中使用它来构建 file:// URL 到文件并导航到它。这是使用页面的稍微做作的方式的一部分,并且只需要使这个特定的示例工作。
接下来,我们使用其 ID 属性查找表。这给了我们一个代表表格的IWebElement。
因为IWebElement和IWebDriver一样有FindElement、FindElements等方法,所以我们可以使用表格的FindElements方法找到表格的所有tr元素的子元素,即所有表中的行。
然后我们得到一个随机数作为行集合的索引。此数字的最大值必须比行数小 1。如果我们要允许选择标题行,那么最小值必须为 0,否则必须为 1。
最后,rows[rowNumber] 是我们随机选择的行。
此示例使用 NUnit 作为测试运行程序和 IWebDriver 的 ChromeDriver 实现,但对于任何浏览器和测试运行程序都应该以相同的方式工作。
注意事项 - 如果您的表格包含另一个表格,此方法可以从外部表格或内部表格中选择一行,尽管由于问题没有提到表格中的表格,我没有满足这一点为了简单起见的可能性。