【问题标题】:Selenium: Find child a tag after getting a list of DOM elementsSelenium:在获取 DOM 元素列表后查找子标签
【发布时间】:2021-03-07 19:41:59
【问题描述】:

首先,我是一名负责处理 Selenium 的 Javascript 开发人员,我现在感受到 QE 所经历的痛苦,哈哈,所以我对 Java 的了解是基本的。我有以下 DOM 结构,我需要能够找到“链接名称 1”并单击它。对于不同测试中的其他链接,我也必须这样做。

<div class="some-container">
  <div class="blah"></div>
  <div>
    <div>
      <div class="common-class-name">
        <a>Link Name 1</a>
      </div>
    </div>
    <div>
      <div class="common-class-name">
        <a>Link Name 2</a>
      </div>
    </div>
    <div>
      <div class="common-class-name">
        <a>Link Name 3</a>
      </div>
    </div>
  </div>
</div>
<div class="some-other-container">
  <div class="blah"></div>
  <div>
    <div>
      <div class="common-class-name">
        <a>Link Name 1</a>
      </div>
    </div>
    <div>
      <div class="common-class-name">
        <a>Link Name 2</a>
      </div>
    </div>
    <div>
      <div class="common-class-name">
        <a>Link Name 3</a>
      </div>
    </div>
  </div>
</div>

这是我尝试过的事情之一,findElementsWithWait 基本上是一个实用函数,它使用 findElements 和等待。这不起作用。

List<WebElement> list = findElementsWithWait(By.className("common-class-name"));

for (WebElement element: list) {
  WebElement el = element.findElement(By.tagName("a"));
  String text = el.getText();
  // other code would check for the proper text and click...
}

根据文本值获取标签列表以便能够点击它们的最佳方法是什么?

【问题讨论】:

  • 我可以从 HTML 示例链接中看到不同的文本。为什么要将它们收集在列表中,然后按单个文本单击每个?
  • 我更新了标记。该页面实际上可以有数百个,它们是作为项目列表一部分的工具提示弹出菜单。我可以使用搜索框来隔离单个项目,所以你的想法会奏效,但如果我不能,其他情况也是如此,我想知道如何处理它。

标签: java selenium selenium-webdriver xpath webdriverwait


【解决方案1】:

尝试通过其链接文本搜索每个锚节点:

By.linkText("Link Name 1")

如果有多个链接具有相同的文本和唯一的祖先,则尝试通过 XPATH 搜索

By.xpath("//div[@class='some-container']//a[.='Link Name 1']")
By.xpath("//div[@class='some-other-container']//a[.='Link Name 1']")

【讨论】:

    【解决方案2】:

    click()&lt;div class="some-container"&gt; 内的第一个链接上,文本为Link Name 1,您需要为elementToBeClickable() 诱导WebDriverWait,您可以使用以下Locator Strategy

    • xpath:

      new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='some-container']//a[text()='Link Name 1']"))).click();
      

    要创建文本为 Link Name 1 的链接列表,您需要为visibilityOfAllElementsLocatedBy() 诱导WebDriverWait,您可以使用以下Locator Strategy

    • xpath:

      List<WebElement> list = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//div[starts-with(@class, 'some') and contains(@class, 'container')]//a[text()='Link Name 1']"))).click();
      

    【讨论】:

      猜你喜欢
      • 2017-02-05
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 2012-12-12
      • 1970-01-01
      相关资源
      最近更新 更多