HtmlElements находит 3 элемента вместо одного в блоке при поиске с XPath

У меня есть блок:

@Block(@FindBy(xpath = "//tr[contains(@class,'bg-success')]"))
public class ShareContentRowBlock extends HtmlElement {

   @FindBy(xpath = "//h3[@class='fileName']/span/a")
   private TextBlock contentNameText;

   public String getContentName() {
       return contentNameText.getText();
   }

   .... // some other elements and methods
}

Я описал страницу:

public class DocumentLibraryPage extends SitePage {

    private List<ShareContentRowBlock> shareContentRowBlocks;

    .....

    public ShareContentRowBlock getShareContentRowBlock(String name){
        for (ShareContentRowBlock conentRowBlock: shareContentRowBlocks){
            if(name.equals(conentRowBlock.getContentName())){
                return conentRowBlock;
            }
        }
        return null;
    }
}

Когда я пытаюсь получить элемент, он возвращает не тот элемент, который я хочу видеть.

У меня есть HTML с элементами дерева:

   html
       h3.fileName
         span 
             a
       h3.fileName
         span 
             a
       table.bg-success
         h3.fileName
             span 
                 a

Я хочу получить элемент <a> внутри таблицы, но возвращает все 3 <a> элементы. Когда я пытаюсь отладить, он действительно находит все <a> элементы с игнорированием родительского блока xpath.

Что с этим не так? Нужно ли менять селекторы или описывать блок по-другому?

1 ответ

Решение

Запуск локатора xpath с "//" означает абсолютную позицию блока. Чтобы сделать относительный поиск, вы должны начать его с ".":

@Block(@FindBy(xpath = "//tr[contains(@class,'bg-success')]"))
public class ShareContentRowBlock extends HtmlElement {

   @FindBy(xpath = ".//h3[@class='fileName']/span/a")
   private TextBlock contentNameText;

   public String getContentName() {
       return contentNameText.getText();
   }

   .... // some other elements and methods
}
Другие вопросы по тегам