Java Selenium:在获取DOM元素列表后查找子标记

Java Selenium:在获取DOM元素列表后查找子标记,java,selenium,selenium-webdriver,xpath,webdriverwait,Java,Selenium,Selenium Webdriver,Xpath,Webdriverwait,首先,我是一名Javascript开发人员,负责处理Selenium,我觉得QE现在经历的痛苦lol,所以我的Java知识是基本的。我有下面的DOM结构,我需要能够找到“链接名1”并单击它。我还必须在不同的测试中对其他链接执行相同的操作 <div class="some-container"> <div class="blah"></div> <div> <div> &

首先,我是一名Javascript开发人员,负责处理Selenium,我觉得QE现在经历的痛苦lol,所以我的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>

链接名称1
链接名称2
链接名称3
链接名称1
链接名称2
链接名称3
这里是我尝试过的一件事,findelementswiitwait基本上是一个实用函数,它使用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...
}
List List=findElementsWithWait(By.className(“公共类名”);
for(WebElement:list){
WebElement el=element.findElement(按.tagName(“a”));
String text=el.getText();
//其他代码将检查正确的文本并单击。。。
}

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

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

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

By.xpath("//div[@class='some-container']//a[.='Link Name 1']")
By.xpath("//div[@class='some-other-container']//a[.='Link Name 1']")
若要
中的第一个链接上单击()
,该链接的文本为链接名称1,您需要将
元素归纳为可折叠()
,您可以使用以下内容:

  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='some-container']//a[text()='Link Name 1']"))).click();
    
    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();
    
要创建文本为链接名称1的链接列表,您需要对AllelementsLocatedBy()的
可见性进行归纳,您可以使用以下内容:

  • xpath

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='some-container']//a[text()='Link Name 1']"))).click();
    
    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();
    
    List List=new WebDriverWait(driver,20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath(//div[以(@class,'some')开头并包含(@class,'container')]//a[text()='Link Name 1'])。单击();
    

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