【问题标题】:Capturing a text/title on the webpage using Selenium WebDriver使用 Selenium WebDriver 在网页上捕获文本/标题
【发布时间】:2014-08-22 13:55:55
【问题描述】:

我正在尝试捕获文本(网页上不同面板的标题)并验证文本内容。我尝试使用 xpath 来捕获文本,但在 WebDriver 上令人惊讶的是,它失败了。相同的 xpath 似乎与 Selenium RC 完美配合。我想知道为什么 WebDriver 似乎无法识别 xpath 而 RC 可以!我试过的代码如下:

assertEquals("Identification requests", driver.findElement(By.xpath("//span[8]")).getText());

我也试过完整的xpath:

assertEquals("Identification requests", driver.findElement(By.xpath("html/body/div[2]/div[2]/div/div/div[1]/div/div[2]/div[2]/div/div/kibana-panel/div/div[1]/div[2]/div/span[8]")).getText());

我也尝试使用类变量,但这些变量似乎都没有返回任何结果。所有尝试都失败,并显示找不到元素的错误。

该部分的html代码如下所示:

<span class="panel-text panel-title ng-binding">Identification requests</span>

上面提到的span部分周围的HTML代码如下所示:

<div class="row-fluid panel-extra">
<div class="panel-extra-container">
<span class="extra row-button" ng-show="panel.editable != false && panel.removable != false">
<span class="extra row-button" ng-hide="panel.draggable == false">
<span class="row-button extra" ng-show="panel.editable != false">
<span class="row-button extra ng-scope" ng-show="task.show" ng-repeat="task in panelMeta.modals">
<span class="row-button extra ng-scope" ng-show="task.show" ng-repeat="task in panelMeta.modals">
<span class="row-button extra ng-scope" ng-show="task.show" ng-repeat="task in panelMeta.modals">
<span class="row-button extra" ng-show="panelMeta.loading == true" style="display: none;">
<span class="panel-text panel-title ng-binding">Identification requests</span>
</div>
</div>
</div>

我怀疑为什么适用于 RC 的 xpath 不适用于 WebDriver。以及我如何能够捕获文本?

【问题讨论】:

  • 你能把&lt;span&gt;周围的HTML贴出来吗?
  • 如果您的span 有可能是动态生成的,您可能需要尝试在调用assertEquals 之前暂停您的代码几秒钟,看看这是否能解决问题。如果此暂停解决了问题,那么您希望使用显式等待来等待元素出现。
  • @sircapsalot 我已将 span 周围的 HTML 添加到上面的详细信息中。
  • @Louis:感谢您的建议。我确实添加了等待,但这并没有帮助。此外,在尝试调试时,我确实提供了足够的时间,然后再进行下一步捕获文本,但它总是失败并出现错误 noelementfound。 :( 另外,span 不是动态生成的。它们代表正在页面某个部分显示的图表的标题。

标签: selenium xpath webdriver selenium-rc capture


【解决方案1】:

我会推荐以下(使用 css 选择器):

String spanCssSelector ="span.panel-text.panel-title.ng-binding";
WebElement spanItem=driver.findElement(By.cssSelector(spanCssSelector));
String textObtained= spanItem.getText().trim();
assertEquals(textObtained,"Identification requests");

希望这对你有用。

【讨论】:

  • 不幸的是,这不起作用。它仍然报告无法找到该元素。 org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"css selector","selector":"span.panel-text.panel-title.ng-binding"} 命令持续时间或超时:30.17 秒
【解决方案2】:

你可以使用断言

assertEquals("Identification requests", driver.findElement(By.xpath("//span[starts-with(@class, 'panel-text')]")).getText());

或者

assertEquals("Identification requests", driver.findElement(By.xpath("//span[@class='panel-text panel-title ng-binding']")).getText());

或者只是通过 Xpath 的 text() 函数找到元素:

driver.findElement(By.xpath("//span[starts-with(@class, 'panel-text')][text()='Identification requests']));

或通过完整的类属性值:

driver.findElement(By.xpath("//span[@class='panel-text panel-title ng-binding'][text()='Identification requests']));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 2015-06-14
    • 2020-01-29
    • 2012-01-20
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多