读取html表的单元格时,第一个值为空';使用Selenium/java创建s行

读取html表的单元格时,第一个值为空';使用Selenium/java创建s行,java,selenium,xpath,html-table,Java,Selenium,Xpath,Html Table,我在从表行读取数据时遇到了一个非常奇怪的问题。这一行有几个单元格。前两个是日期时间(2017年3月27日08:30),代码: 文件历史报告 开始时间 结束时间 机器 场地 操作人员 性情 地位 结果 数据源 03/27/2017 08:30 03/27/2017 08:30 TMX_01 Techmex 安妮 完整的 好 完成了 D:\TMX\u 01\WORKING\27003001.txt/1 parent.endTimems=new Date().getTime(); if(parent

我在从表行读取数据时遇到了一个非常奇怪的问题。这一行有几个单元格。前两个是日期时间(2017年3月27日08:30),代码:


文件历史报告
开始时间
结束时间
机器
场地
操作人员
性情
地位
结果
数据源
03/27/2017 08:30
03/27/2017 08:30
TMX_01
Techmex
安妮
完整的
好
完成了
D:\TMX\u 01\WORKING\27003001.txt/1
parent.endTimems=new Date().getTime();
if(parent.starttimes)
{
parent.timeTakenms=parent.endTimems-parent.starttimes;
parent.starttimes=null;
if(parent.debugdiv&&parent.timeTakenms)
parent.debugdiv.innerHTML=parent.timeTakenms/1000+“秒”;
}
一张基本的桌子真的。。。下面是我的方法,它使用xpath读取代码

public String[] getTimesFromDocumentHistoryReportPage() {
    String XPATH_DETAILS_BASE = "//div['OUTPUTSECTION']/table/tbody/tr[3]/td";
    String[] data = new String[2];

    for (int i = 0; i < 2; i++) {
        String XPATH_DETAILS = XPATH_DETAILS_BASE + "[" + (i + 1) + "]";
        data[i] = getElement(By.xpath(XPATH_DETAILS)).getText();
    }
    return data;
}
公共字符串[]getTimesFromDocumentHistoryReportPage(){
字符串XPATH_DETAILS_BASE=“//div['OUTPUTSECTION']/table/tbody/tr[3]/td”;
字符串[]数据=新字符串[2];
对于(int i=0;i<2;i++){
字符串XPATH_DETAILS=XPATH_DETAILS_BASE+“[”+(i+1)+“]”;
data[i]=getElement(By.xpath(xpath_DETAILS)).getText();
}
返回数据;
}

对于数据[0],我得到的是一个空值,即使将html和xpath复制并粘贴到一个在线测试程序中:videlibri.sourceforge.net/cgi-bin/xidelcgi返回一个有效结果。下一步返回数据[1],该数据具有正确的值。我在这里遗漏了什么?

好的,我不确定发生了什么,但既然您成功地从页面源获取了数据,我建议您将其粘贴到html解析器(我使用jsoup),然后提取数据

public String[] getTimesFromDocumentHistoryReportPage() {
    Document document = Jsoup.parse(driver.getPageSource());
    Elements elements = document.select("#OUTPUTSECTION .tableTextWhite > td");
    String[] data = new String[2];

    for (int i = 0; i < 2; i++) {
        data[i] = elements.get(i).text()
    }
    return data;
}
公共字符串[]getTimesFromDocumentHistoryReportPage(){
Document Document=Jsoup.parse(driver.getPageSource());
元素=文档。选择(“#OUTPUTSECTION.tableTextWhite>td”);
字符串[]数据=新字符串[2];
对于(int i=0;i<2;i++){
data[i]=elements.get(i).text()
}
返回数据;
}
我现在不在我的电脑上,我还没有尝试我的代码,所以可能有语法错误,一定要让我知道,我会修复它


您可以在这里下载Jsoup:

考虑到我一直在苦苦挣扎的代码:

<tr class="tableTextWhite">
  <td align="CENTER">03/27/2017 08:30</td>
  <td align="CENTER">03/27/2017 08:30</td>
  <td align="CENTER">TMX_01</td>
  <td align="CENTER">Techmex</td>
  <td align="CENTER">Anne</td>
  <td align="CENTER">Completed</td>
  <td align="CENTER">Good</td>
  <td align="CENTER">Finished</td>
  <td align="CENTER">D:\TMX_01\WORKING\27003001.txt/1</td>
</tr>

03/27/2017 08:30
03/27/2017 08:30
TMX_01
Techmex
安妮
完整的
好
完成了
D:\TMX\u 01\WORKING\27003001.txt/1
这是@SDBot提出的最终有效解决方案:

    public String[] getTimesFromDocumentHistoryReportPage() {
        String htmlSource = driver.getPageSource();
        final Pattern pattern = Pattern.compile("<td align=\"CENTER\">(.+?)</td>");
        final String[] tagValues = new String[2];
        final Matcher matcher = pattern.matcher(htmlSource);

        for (int i = 0; i < 2; i++) {
            matcher.find();
            tagValues[i] = matcher.group(1);
        }
        return tagValues;
    }
公共字符串[]getTimesFromDocumentHistoryReportPage(){
字符串htmlSource=driver.getPageSource();
最终模式=Pattern.compile((.+?));
最终字符串[]标记值=新字符串[2];
final Matcher Matcher=pattern.Matcher(htmlSource);
对于(int i=0;i<2;i++){
matcher.find();
tagValues[i]=匹配器组(1);
}
返回标记值;
}
该方法在给定的htmlSource中进行搜索,并查找位于和html标记之间的所有数据实例(+?)。这对我来说已经足够了


因为我对前两个单元格值感兴趣,所以进行2次迭代并返回结果就足够了。考试通过了。谢谢大家!

您显示的HTML代码,它是否属于表的第3行?是。这是第三排。第二个单元格被正确读取。您是否手动尝试过这个xpath”//div['OUTPUTSECTION']/table/tbody/tr[3]/td[1]“是的,//div['OUTPUTSECTION']/table/tbody/tr[3]/td[1]工作正常。但是当我运行测试时,Selenium会选择空值…您可以将循环值增加到>2,然后发布结果吗。最好等于行大小既然你以前的解决方案似乎奏效了,我就不追求这个了。我们为外部图书馆制定了认证流程。这很麻烦。没关系,你可以把你的解决方案贴在这里,并把它标记为正确答案。
    public String[] getTimesFromDocumentHistoryReportPage() {
        String htmlSource = driver.getPageSource();
        final Pattern pattern = Pattern.compile("<td align=\"CENTER\">(.+?)</td>");
        final String[] tagValues = new String[2];
        final Matcher matcher = pattern.matcher(htmlSource);

        for (int i = 0; i < 2; i++) {
            matcher.find();
            tagValues[i] = matcher.group(1);
        }
        return tagValues;
    }