背景
我正在使用Selenium WebDriver / Java来抓一张桌子。我感兴趣的表分为许多单独的页面(=一个必须单击链接才能看到下一页)。在表的底部是一个不完整的数字索引(整个表是170多页。当你在前20页之一,索引包含第1-20页的链接,当你在第21-40页时, index包含指向第21-40页的链接等)您可以在其中单击特定数字以加载该页面。整个索引位于一个单元格中,例如1 2 ... 20。还有 First , Previous 页面, Next 和 Last 页面的链接。
当前页面的/链接数具有特定的类( CurrentPage )。我通过单击 Next 浏览每个页面,这就是问题:当我进入下一页时,如何验证表格是否已完成加载?
通常在这个项目中,为了在Selenium继续之前验证页面是否已完全加载,我使用类似这样的代码:
webDriverBackedSelenium.click(xpathToSomeLink);
new WebDriverWait(driver, normalTimeout).until(ExpectedConditions.presenceOfElementLocated(By.xpath(xpathToSomeElemen)));
现在我的问题/问题:我无法编写可以在上面的代码中使用的XPath。我想我需要的是,在Selenium点击链接后,查看A
- 具有 CurrentPage 类的标记的内容,并验证它是否已更改(+1)与点击前相比。
我发现看起来像是一个很好的例子,说明如何编写定位标记内容的XPath http://manual.calibre-ebook.com/xpath.html#selecting-by-tag-content但是当我在Firebug / Firepath中运行他们的示例//h:h2[re:test(., 'chapter|section', 'i')]
时,我收到一条错误消息XPath无效。为什么?他们的例子出了什么问题?我如何编写一个可以区分这两种情况的XPath(第一种情况我在第21页,第二种情况是我在第22页):
<table>
<tr>
<td>
<a class="CurrentPage" href="javascript:doPostBack('XXX')">21</a>
<a class="OtherPage" href="javascript:doPostBack('XXX')">22</a>
<table>
<tr>
<td>
<a class="OtherPage" href="javascript:doPostBack('XXX')">21</a>
<a class="CurrentPage" href="javascript:doPostBack('XXX')">22</a>
最后一点:我正在使用Selenium从网站上抓取数据,也就是说,重新设计它以使上述更容易,不是一种选择。
答案 0 :(得分:0)
如果这些只是两个标签,那么请使用css选择器,这样更容易。孩子的数量可以通过一个简单的循环来控制
td a:nth-child(2)
答案 1 :(得分:0)
所以你似乎有两个问题:
A1。 xpath将是:
//a[@class='CurrentPage']
A2。等待页面上的元素可见,例如:
WebDriverWait wait = new WebDriverWait(driver, 10); //wait however long to ensure it should be loaded
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("CurrentPage")));
答案 2 :(得分:0)
我最终使用了这个XPath构造//a[.='17']
和类似下面的代码(略微简化):
int nextPageNumber = Integer.parseInt(driver.findElement(By.xpath(linkActivePage)).getText()) + 1)
String xpathToNextPage = "xPathPrefix + "a[.='" + nextPageNumber + "']";
webDriverBackedSelenium.click(linkNextPage);
new WebDriverWait(driver, normalTimeout).until(ExpectedConditions.presenceOfElementLocated(By.xpath(xpathToNextPage)));
似乎工作正常,但我欢迎评论如何改进它!