Selenium webdriver在页面更改后获取元素
Posted
技术标签:
【中文标题】Selenium webdriver在页面更改后获取元素【英文标题】:Selenium webdriver getting element after page changes 【发布时间】:2015-12-01 05:02:47 【问题描述】:非常简单的问题,基本上我是在点击另一个链接后尝试获取 li 元素的文本。该链接将导致 li 命令发生更改。每当我尝试获取文本时,它都会在订单更改之前返回文本。订单从点击链接更改后如何获取 li 文本?该链接不会重新加载页面本身。
这是我用来获取元素的内容:
driver.findElement(By.cssSelector("li[id^='coupon_']:nth-of-type(1) p.brand")).getText();
更改本身将来自:
<div id="id1">
<ul class="pods">
<li rel="" title="some text" id="coupon_1" data-pos="1">
...
<p class="brand">brand1</p>
...
</li>
</ul>
</div>
到:
<div id="id1">
<ul class="pods">
<li rel="" title="some text" id="coupon_5" data-pos="1">
...
<p class="brand">brand5</p>
...
</li>
</ul>
</div>
我遇到过类似的情况,我会使用 wait.until 来显示发生变化的元素,然后获取它,但在这种情况下,li 元素已经存在,但只是在单击链接后发生了变化。如何获取新的元素文本?谢谢!
【问题讨论】:
您知道点击链接后到底发生了什么变化吗?您能否以 html 的形式公开它:提供之前和之后的 HTML。 它会从:<div><ul class="blah"><li id="coupon_1"><p class="brand">brand1</p>...</li></ul></div>
变为:<div><ul class="blah"><li id="coupon_5"><p class="brand">brand5</p>...</li></ul></div>
虽然当我点击链接时我不会提前知道 ID
请编辑问题并将此信息添加到其中。
所以,如果我错了,请纠正我:基本上,如果你点击链接,优惠券的数量会改变?..
不是数量,只是内容变化,比如id、品牌名称等。其他都一样
【参考方案1】:
您可以等待li
中的id变化
WebDriverWait wait = new WebDriverWait(driver, 10);
// wait for the new li to appear
WebElement li = wait.until(ExpectedConditions.elementToBeClickable(By.id("coupon_5")));
System.out.println(li.findElement(By.cssSelector("p.brand")).getText().trim());
或者,如果新 id 有多种可能性,那么您可以等待旧 id 元素过时。
// get the original li that will be changed
WebElement oldLi = driver.findElement(By.id("coupon_1"));
WebDriverWait wait = new WebDriverWait(driver, 10);
// wait for the original li to go stale... change
wait.until(ExpectedConditions.stalenessOf(oldLi));
// grab the new element by whatever the new id is
WebElement newLi = driver.findElement(By.id("coupon_5"));
System.out.println(newLi.findElement(By.cssSelector("p.brand")).getText().trim());
【讨论】:
是的,stalenessOf
的完美用例! +1。
使用 stalenessOf 非常适合检测页面转换。阅读this article...这是我了解这些概念的地方。好东西。以上是关于Selenium webdriver在页面更改后获取元素的主要内容,如果未能解决你的问题,请参考以下文章
使用 Dojo ID 进行 Selenium WebDriver 测试 [重复]
无法使用 Selenium 和页面工厂在页面对象类中调用“org.openqa.selenium.WebDriver.getTitle()”