java - 将数据库结果与 html 表进行比较 - Selenium Webdriver - Java

标签 java selenium selenium-webdriver

我需要一些帮助才能获取数据库结果并验证它们是否正确显示在屏幕上。表的大小取决于数据库中的数据量。

以下是该表的一些 HTML 示例:

<table class="table table-hover">
<thead>
<tbody>
<tr class="ng-scope" ng-repeat="item in PaymentHistoryCtrl.paymentHistoryArray | orderBy: 'date' track by $index ">
<td class="ng-binding" ng-bind="item.date | date:'longDate'">February 12, 2016</td>
<td class="ng-binding" ng-bind="item.policyNumber">BTB1716401</td>
<td class="ng-binding" ng-bind="item.total | currency">$3,000.00</td>
<td class="ng-binding" ng-bind="item.referenceNumber">3***8431</td>
</tr>
<tr class="ng-scope" ng-repeat="item in PaymentHistoryCtrl.paymentHistoryArray | orderBy: 'date' track by $index ">
<td class="ng-binding" ng-bind="item.date | date:'longDate'">February 12, 2016</td>
<td class="ng-binding" ng-bind="item.policyNumber">BTB1716401</td>
<td class="ng-binding" ng-bind="item.total | currency">$55.00</td>
<td class="ng-binding" ng-bind="item.referenceNumber">3***8431</td>
</tr>

这是表格的示例视觉效果:

enter image description here

我有一个 SQL 查询来收集屏幕上显示的信息。但是,我该如何将记录与表中的行/列进行匹配呢?这是我用于连接数据库的 java:

//Load the required JDBC Driver class
Connection conn = null;
Statement stmt = null;
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  

//Create a connection to the database
String connection = "jdbc:sqlserver://" + dbName + ":" + dbPort;
conn = DriverManager.getConnection(connection,dbUsername,dbPassword);

//Execute SQL query
stmt = conn.createStatement();
String sql = "select * from Table";
ResultSet rs = stmt.executeQuery(sql);

最佳答案

很难理解是什么生成了您提供的 html,但如果您可以完全控制每个数据行的生成,则可以为每个元素分配一个 ID。当您创建 Jasper 报告(结果是一个 html 表格)时,这特别有用。

假设您的表格行如下所示:

<tr id="result_1" class="ng-scope" ng-repeat="item in PaymentHistoryCtrl.paymentHistoryArray | orderBy: 'date' track by $index ">
    <td id="result_1_date" class="ng-binding" ng-bind="item.date | date:'longDate'">February 12, 2016</td>
    <td id="result_1_policyNum" class="ng-binding" ng-bind="item.policyNumber">BTB1716401</td>
    <td id="result_1_total" class="ng-binding" ng-bind="item.total | currency">$3,000.00</td>
    <td id="result_1_refNum" class="ng-binding" ng-bind="item.referenceNumber">3***8431</td>
</tr>

然后您可以做的是对 selenium webDriver 进行简单调用以获取元素的文本。

WebElement element = driver.findElement(By.id("result_1_total"))

如果情况并非如此,或者您不关心个人 <td>元素,除了它们只存在于页面上之外,您可以简单地循环遍历它们。

//find the table on the page
WebElement tblEle = driver.findElement(By.id("myTable"))
List<WebElement> tblElements = tblEle.findElements(By.Xpath("/tbody/tr/"));
for (WebElement tblElementRow : tblElements) {
    List<WebElement> allTds = tblElementRow.findElement(By.xpath("td"))
    // do somthing with the list of allTds
}

另外,如果我是你,我不会执行 stmt.executeUpdate(),而是执行 stmt.executeQuery,它会返回结果集。这样,您可以循环遍历结果,并将它们添加到数组中。当数组填满后,您可以向其中添加简单的机制,将其与您生成的表关联起来。

例如:

List<MyObject> objs = new ArrayList<>();
ResultSet rs = stmt.executeQuery("Select * from Table");
while (rs.next()) {
    // construct obj from rs
    objs.add(myCreatedObj);
}

MyObject findFromObjs(final String id) {
    for (MyObject cool : objs) {
        if (cool.getId().equals(id)) return cool
    }
}

然后,当您调用此函数时:

WebElement element = driver.findElement(By.id(findFromObjs("myFirstRs")))

同样,这一切都取决于您拥有多少权力、粒度和控制力。这将决定您如何解决这个问题。当处理不会产生荒谬的 xpath 的技术时,有时,更容易 Hook Id。相反,如果不能分配ID,也可以使用xpath,但使用起来可能会困难一些。

最后,检查 xpath(如果您计划使用该路径)的一个简单方法是在 Firefox 的控制台中运行它。像这样的事情将是一个好的开始:

$x("//tbody/tr/td[contains(text(), 'news')]")

关于java - 将数据库结果与 html 表进行比较 - Selenium Webdriver - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35556912/

相关文章:

python - 无法解析包含表格数据(iframe)的网站中的元素

java - Selenium 使用太多内存

java - Chrome 选项 - Selenium 3.10 - NoSuchMethodError : com. google.common.collect.ImmutableList.toImmutableList()

java - 使用正则表达式获得最佳小组比赛

JavaFX - TextFlow 中的下标和上标文本

java - WebDriver 的 executeScript 返回警报文本而不是从 JavaScript 方法返回的值

java - diver.findElements 在 Selenium 中被挂起

google-chrome - Selenium webdriver 中的 "Unable to move the cache"错误

java - 将方法参数传递给java中byte,int,int类型的方法参数

Java:为什么它使用固定数量的内存?或者它如何管理内存?