【问题标题】:How can I verify presence of text under a specific <DIV> tag using Selenium WebDriver (java) and Chrome?如何使用 Selenium WebDriver (java) 和 Chrome 验证特定 <DIV> 标记下的文本是否存在?
【发布时间】:2014-01-28 09:45:53
【问题描述】:

背景:我在 Java 中使用 Selenium WebDriver,并使用 Google Chrome 作为我的浏览器。

所以我不太确定这个。我知道如何确定页面上是否存在特定文本,但是如果我想查找多个文本实例怎么办?例如,如果“Hello”一词在页面顶部,并且“Hello”一词也出现在展开元素时,我如何在不完全指定其 xpath 的情况下验证第二个“Hello”是否存在?

例如:

WebDriverWait wait = new WebDriverWait(driver, WAIT_TIME);
foundElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[contains(text(),'" + expectedText + "')]")));

...这将获得我要查找的文本的第一个实例...但是如果我要查找另一个特定实例(第 3 个、第 4 个)怎么办?

尝试避免使用类似这样的方法:

WebDriverWait wait = new WebDriverWait(driver, WAIT_TIME);
foundElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("(//*[contains(text(),'" + expectedText + "')])[2]")));

最好我想尝试指定它所在的元素。大家有什么想法吗?

我不太熟悉 xpath...但假设我想做这样的事情(我已经知道这是无效的/不起作用):

WebElement foundElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"elementID\"]/[contains(text(),'" + text + "')]")));

我希望这是有道理的!如果需要任何澄清,请告诉我。

小更新:

我试过没有用:

WebElement foundElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"elementID\"]/*/[contains(text(),'" + text + "')]")));

这是包含我要查找的文本的路径:

//*[@id="Highchart_chart_property_hot_alerts"]/div[1]/div[1]

这是页面上文本的第二次出现。查找是否存在的一种可能可接受的方法是检查两个文本是否都存在,而不是仅第二个文本。所以我可能会尝试这种方法。任何其他见解仍然欢迎。

【问题讨论】:

  • By.xpath("//*[@id='elementID']/*[contains(text(),'" + text + "')]") 看起来完全有效,为什么它不起作用?
  • 我想可能是因为我正在寻找的文本有点深。我收到了一个超时异常。我的问题是我试图让它尽可能通用,以便适应很多情况。这是我要查找的文本的完整 xpath: //*[@id="elementID"]/div[1]/div[1] 理想情况下,我想避免使用比 elementID 更远的任何内容。
  • 您可以发布您有兴趣查找的元素的示例 html 吗?
  • @nilesh 我相应地更新了问题。这有帮助吗?感谢你们花时间研究我的问题!
  • 我不是在寻找 xpath。我正在寻找html。您为“Hello”的第二个实例发布的 xpath 是吗?你能找到第一个“Hello”实例吗?

标签: java html selenium xpath selenium-webdriver


【解决方案1】:

假设您的基本 HTML 是:

<table id='bar'>
  <tr>
    <td>
      <div>
        <div class="foo">hello</div>
        <div>world</div>
      </div>
    </td>
  </tr>
</table>

您需要始终指定要在 xpath 中查找的标记类型。所以使用//table/tr/td/div/[@class='foo'] 是行不通的。 /*/ 也不是很有用,因为// 的意思是“跳过任意数量的孩子和他们的孩子等等”。因此你会想要://table[@id='bar']//div[@class='foo']

所以关于你的问题,解决方案似乎是:

By locator = By.xpath("//*[@id='Highchart_chart_property_hot_alerts']//div[contains(text(),'" + text + "')]");
WebElement foundElement = waitAndFindElement(locator);

private WebElement waitAndFindElement(By locator) {
  WebDriverWait wait = new WebDriverWait(driver, WAIT_TIME);
  return wait.until(ExpectedConditions.presenceOfElementLocated(locator)));
}

【讨论】:

  • 完美!清晰简洁的解释。非常感谢!
  • 实际上,我认为 .//div[text()[contains('text')]] 在某些情况下也可能适用于上述答案。
  • 可能,但他说他有多个 hello 实例并且只想要一个特定的实例,因此您的会捕获任何带有文本的 div,因此可能会匹配其中一个或全部。很难说没有看到实际的 HTML 源代码。
【解决方案2】:

方法:

通过获取索引:

包含文本 "Hello":css=div:contains("Hello") 的 div 的 CSS 选择器

List<WebElement> texts = driver.findElements(By.cssSelector("div:contains('Hello')"));

if(texts.get(2).getText().equals("hello")

    // Then Second Element that contains the Text Hello is present.

else 

    // Not Present.

【讨论】:

    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 2018-05-28
    • 2014-04-18
    • 1970-01-01
    • 2013-09-26
    • 2014-01-05
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多