【问题标题】:Selenium Webdriver: Read a table completelySelenium Webdriver:完全读取表格
【发布时间】:2012-09-20 17:22:55
【问题描述】:

场景:网页中的表格很少。我想完全阅读其中一张表,但问题是只显示了 10 行,其余的我必须向下滚动。实际上最初只有 10 行可用,当我们滚动时渲染其余的字段。 为了解决这个问题,我想我会模拟按键并继续阅读,但问题是即使 xpath 也不一致,所以也不能循环。几个不同单元格的 Xpath 是:

html/body/div[2]/form/div[1]/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div[2]/div/span/div[1]/div/div/div/div[2]/div/div[2]/table/tbody/tr[1]/td[1]

html/body/div[2]/form/div[1]/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div[2]/div/span/div[1]/div/div/div/div[2]/div/div[2]/table[2]/tbody/tr[3]/td[1]

html/body/div[1]/form/div[1]/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div[2]/div/span/div[1]/div/div/div/div[2]/div/div[2]/table[1]/tbody/tr[10]/td[1]

我可以通过什么方式获取所有单元格中的数据?

HTML 源代码:

    <div id="pt1:ph1" class="x6v">
    <table class="xtb" width="0" cellspacing="0" cellpadding="0" border="0" summary="">
    <div class="xvp">
    <div>
    <div id="pt1:pc1" class="xpb xph" _afrclmwmn="['c1','c2','c3','c4','c5','c6','c7','c8','c9','c10']" _afrac="pt1:pc1:md1" style="height: 282px;">
    <div id="pt1:pc1::_ahTp" style="height:auto">
    <div id="pt1:pc1::_ahCt">
    <div id="pt1:pc1:md1" class="xpj xpb" _leafcolclientids="['pt1:pc1:md1:c1','pt1:pc1:md1:c2','pt1:pc1:md1:c3','pt1:pc1:md1:c4','pt1:pc1:md1:c5','pt1:pc1:md1:c6','pt1:pc1:md1:c7','pt1:pc1:md1:c8','pt1:pc1:md1:c9','pt1:pc1:md1:c10','pt1:pc1:md1:c11','pt1:pc1:md1:c12']" _afrfilterable="true" _afrautohr="10" _afrhcc="0" _afrpcid="pt1:pc1" tabindex="0" style="height: 234px;">
    <div id="pt1:pc1:md1::ch" class="xz5" _afrcolcount="12" style="overflow: hidden; position: relative; width: 753px;">
    <div id="pt1:pc1:md1::db" class="xyy" _afrcolcount="12" style="position: relative; width: 753px; overflow: hidden; height: 170px; z-index: 1;">
    <table class="xyz xzr" cellspacing="0" _startrow="0" _rowcount="44" _selstate="{'0':true}" _totalwidth="1260" style="table-layout:fixed;position:relative;width:1260px;">
    <tbody>
    <tr class="xzn p_AFSelected" _afrrk="0">
    <td class="xzk" nowrap="" style="width:100px;">12</td>
    <td class="xzk" nowrap="" style="width:100px;">A12</td>
    <td class="xzk" nowrap="" style="width:100px;">B12</td>
    <td class="xzk" nowrap="" style="width:100px;">B12</td>
    <td class="xzk" nowrap="" style="width:100px;">C12</td>
    <td class="xzk" nowrap="" style="width:100px;">D12</td>
    <td class="xzk" nowrap="" style="width:100px;"> </td>
    <td class="xzk" nowrap="" style="width:100px;">K12</td>
    <td class="xzk" nowrap="" style="width:100px;"> </td>
    <td class="xzk" nowrap="" style="width:100px;"> </td>
    <td class="xzk" nowrap="" style="width:100px;"> </td>
    <td class="xzk" nowrap="" style="width:100px;">G12</td>
    </tr>
    <tr class="xzn" _afrrk="1">
    <tr class="xzn" _afrrk="2">
    <tr class="xzn" _afrrk="3">
    <tr class="xzn" _afrrk="4">
    <tr class="xzn" _afrrk="5">
    <tr class="xzn" _afrrk="6">
    <tr class="xzn" _afrrk="7">
    <tr class="xzn" _afrrk="8">
    <tr class="xzn" _afrrk="9">
    </tbody>
    </table>
    </div>
    <div id="pt1:pc1:md1::sm" class="xzu" style="position:absolute;display:none"></div>
    <div id="pt1:pc1:md1::ri" class="xz0" style="position:absolute;display:none;overflow:hidden"></div>
    <div id="pt1:pc1:md1::dataW" style="display:none"></div>
    <div id="pt1:pc1:md1::scroller" tabindex="-1" style="position: absolute; overflow: auto; z-index: 0; width: 770px; top: 46px; height: 187px; right: 0px;">
    </div>
    </div>
    <div id="pt1:pc1::_ahBt" style="height:auto">
    <div id="pt1:pc1:_clmCxt" style="display:none">
    <div id="pt1:pc1:_PCPop" style="display:none">
    <div id="pt1:pc1::_dchDlgC" style="display:none">
    </div>
    </div>
    </div>
    </div>

滚动后的 HTML。

    <div id="pt1:ph1" class="x6v">
    <table class="xtb" width="0" cellspacing="0" cellpadding="0" border="0" summary="">
    <div class="xvp">
    <div>
    <div id="pt1:pc1" class="xpb xph" _afrclmwmn="['c1','c2','c3','c4','c5','c6','c7','c8','c9','c10']" _afrac="pt1:pc1:md1" style="height: 282px;">
    <div id="pt1:pc1::_ahTp" style="height:auto">
    <div id="pt1:pc1::_ahCt">
    <div id="pt1:pc1:md1" class="xpj xpb" _leafcolclientids="['pt1:pc1:md1:c1','pt1:pc1:md1:c2','pt1:pc1:md1:c3','pt1:pc1:md1:c4','pt1:pc1:md1:c5','pt1:pc1:md1:c6','pt1:pc1:md1:c7','pt1:pc1:md1:c8','pt1:pc1:md1:c9','pt1:pc1:md1:c10','pt1:pc1:md1:c11','pt1:pc1:md1:c12']" _afrfilterable="true" _afrautohr="10" _afrhcc="0" _afrpcid="pt1:pc1" tabindex="0" style="height: 234px;">
    <div id="pt1:pc1:md1::ch" class="xz5" _afrcolcount="12" style="overflow: hidden; position: relative; width: 753px;">
    <div id="pt1:pc1:md1::db" class="xyy" _afrcolcount="12" style="position: relative; width: 753px; overflow: hidden; height: 170px; z-index: 1;">
    <table class="xyz xzr" cellspacing="0" _startrow="10" _rowcount="44" style="table-layout:fixed;position:relative;width:1260px;">
    <tbody>
    <tr class="p_AFFocused p_AFSelected xzn" _afrrk="10">
    <tr class="xzn" _afrrk="11">
    <tr class="xzn" _afrrk="12">
    <tr class="xzn" _afrrk="13">
    <tr class="xzn" _afrrk="14">
    <tr class="xzn" _afrrk="15">
    <tr class="xzn" _afrrk="16">
    <tr class="xzn" _afrrk="17">
    <tr class="xzn" _afrrk="18">
    <tr class="xzn" _afrrk="19">
    </tbody>
    </table>
    <table class="xyz xzr" cellspacing="0" _startrow="20" _rowcount="44" style="table-layout:fixed;position:relative;width:1260px;">
    </div>
    <div id="pt1:pc1:md1::sm" class="xzu" style="position: absolute; display: none; z-index: 5000; visibility: visible; top: 120px; right: 25px;">Fetching Data...</div>
    <div id="pt1:pc1:md1::ri" class="xz0" style="position:absolute;display:none;overflow:hidden"></div>
    <div id="pt1:pc1:md1::dataW" style="display:none"></div>
    <div id="pt1:pc1:md1::scroller" tabindex="-1" style="position: absolute; overflow: auto; z-index: 0; width: 770px; top: 46px; height: 187px; right: 0px;">
    </div>
    </div>
    <div id="pt1:pc1::_ahBt" style="height:auto">
    <div id="pt1:pc1:_clmCxt" style="display:none">
    <div id="pt1:pc1:_PCPop" style="display:none">
    <div id="pt1:pc1::_dchDlgC" style="display:none">
    </div>
    </div>
    </div>
    </div>
    <div id="pt1:ph2" class="x6v">
    </span>
    </div>
    </div>

【问题讨论】:

  • XPath 太具体了。复制/粘贴表格的 HTML。
  • @gSr 您的表格行具有看起来像实际 row_number 的“_afrrk”属性。如果这是真的,请使用此属性作为元素的 id。

标签: selenium webdriver


【解决方案1】:

尝试使用这种方法: 1) 动作生成器,高级用户 API 特别是 MoveMouseAction 方法 - 将鼠标从其当前位置移动到另一个元素。 你可以得到here更多关于actions builder的信息

2) 在网页元素被渲染之前不要忘记使用fluent wait

public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                }
                }
);
                           return  foo;              }     ;

By xpathElem=By.xpath("html/body/div[2]/form/div[1]/div[2]/div/div[2]/div/div[2]/div/div[2]/div/div[2]/div/span/div[1]/div/div/div/div[2]/div/div[2]/table/tbody/tr[1]/td[1]");
//getting data from cells
fluentWait(xpathElem).getText().trim();

希望这对你有所帮助;-)

【讨论】:

  • 使用 MoveMouseAction 我可以 scoll 表格,我可以做到,但是滚动的记录在运行时呈现,如何读取它们?
  • 使用 fluent wait 可以轻松获取呈现的记录,使用 getText() 可以从表记录中获取文本。适合你吗?
  • 感谢您的回答,在向下滚动表格的 xpath/id 更改后,正如我在顶部所写的那样。所以即使使用fluent wait,它也会等待记录被渲染,ID/Xpath不同所以无法识别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 2015-06-24
  • 2013-08-31
  • 1970-01-01
相关资源
最近更新 更多