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。 它会从:&lt;div&gt;&lt;ul class="blah"&gt;&lt;li id="coupon_1"&gt;&lt;p class="brand"&gt;brand1&lt;/p&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; 变为:&lt;div&gt;&lt;ul class="blah"&gt;&lt;li id="coupon_5"&gt;&lt;p class="brand"&gt;brand5&lt;/p&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt; 虽然当我点击链接时我不会提前知道 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在页面更改后获取元素的主要内容,如果未能解决你的问题,请参考以下文章

Selenium WebDriver 放大/缩小页面内容

selenium webdriver (python)大全

使用 Dojo ID 进行 Selenium WebDriver 测试 [重复]

无法使用 Selenium 和页面工厂在页面对象类中调用“org.openqa.selenium.WebDriver.getTitle()”

使用java在Selenium WebDriver(Selenium 2)中向上或向下滚动页面

Python Selenium Webdriver - 动态更改代理设置