Java 无法在列表中的列表中单击WebElement

Java 无法在列表中的列表中单击WebElement,java,reactjs,selenium,Java,Reactjs,Selenium,我有一个WebElements列表,我打算使用streams()对其进行筛选,然后将每个元素与字符串匹配,最后单击该元素。到目前为止,我还无法调试这个小问题,可以借助StackOverflow社区的briliant minds 我的页面对象类由以下内容组成: @FindBy(how = How.CSS, using = "ul.container-content > li:nth-of-type(1) > ul > li > a") private List<Web

我有一个WebElements列表,我打算使用streams()对其进行筛选,然后将每个元素与字符串匹配,最后单击该元素。到目前为止,我还无法调试这个小问题,可以借助StackOverflow社区的briliant minds

我的页面对象类由以下内容组成:

@FindBy(how = How.CSS, using = "ul.container-content > li:nth-of-type(1) > ul > li > a")
private List<WebElement> lnkMenuItems;

private WebElement getElementFromList(List<WebElement> elements, String title) {
    return elements.stream()
            .filter(element -> element.getText().contains(title))
            .findFirst()
            .orElseThrow(null);
}

public void clickOnMenuItem(String title) {
    btnMegaMenu.click();
    WebElement lnkMenuItem = getElementFromList(lnkMenuItems, title);
    // global wait method from my base page class utilizing fluentwait
    waitFor(lnkMenuItem);
    lnkMenuItem.click();
}
@FindBy(how=how.CSS,使用=“ul.container-content>li:nth of type(1)>ul>li>a”)
私人物品清单;
私有WebElement getElementFromList(列表元素,字符串标题){
返回元素。stream()
.filter(元素->元素.getText().contains(标题))
.findFirst()
.orelsetrow(空);
}
公共无效clickOnMenuItem(字符串标题){
btnMegaMenu.click();
WebElement lnkMenuItem=getElementFromList(lnkMenuItems,标题);
//利用fluentwait从我的基页类中获取全局等待方法
waitFor(lnkMenuItem);
lnkMenuItem.click();
}
我尝试自动化的菜单应用程序是使用ReactJS编写的,下面是我基于CSS选择器的代码片段:

<div class="nav-menu  ">
<ul role="menu" class="container-content">
    <li>
        <a href="/betale" target="" role="menuitem" class=" header-hidden-mobile">Betaling og kort</a>
        <button class=" sub-menu-btn header-hidden-desktop" aria-label="Betaling og kort" aria-haspopup="true" aria-controls="defe4678-4bf6-4657-b677-ea732da4182c">Betaling og kort</button>
        <button class="mobile-menu-back" aria-label="Tilbake til hovedmeny">Betaling og kort</button>
        <ul id="defe4678-4bf6-4657-b677-ea732da4182c">
            <li>
                <a href="/betale" target="" class=" header-hidden-desktop" role="menuitem">
                    <span class="sr-only">Betaling og kort</span> Oversikt
                </a>
            </li>
            <li>
                <a href="/spare" target="" class="" role="menuitem">QA Mega Menu Clone Test</a>
            </li>
            <li>
                <a href="/betale/bankid" target="" class="" role="menuitem">BankID p&#229; Mobil</a>
            </li>
            <li>
                <a href="/betale/bankkort" target="" class="" role="menuitem">Bankkort</a>
            </li>

  • 贝塔林奥格科特酒店 贝塔林奥格科特酒店

我根据作为参数传入的字符串动态地定位URL(在本例中是第四个
  • ),但我似乎无法单击元素。我的CSS选择器有问题吗?任何其他指针都将受到欢迎。

    问题来自于在以下代码中使用错误的注释,您希望以列表的形式找到所有匹配的元素,您应该使用
    @FindAll
    @FindBys
    ,而不是返回一个元素的
    @FindBy

    @FindAll({@FindBy(css = "ul.container-content > li:nth-of-type(1) > ul > li > a")})
    private List<WebElement> lnkMenuItems;
    
    @FindAll({@FindBy(css=“ul.container-content>li:nth of type(1)>ul>li>a”))
    私人物品清单;
    
    似乎Selenium始终能够在菜单项上触发click事件。我只需要一个方法将重定向链接在一起,并验证预期结果是否符合我的标准。吸取教训

    无论我是使用
    @FindAll
    还是仅使用
    @FindBy
    我仍然得到相同的结果,12个菜单项的大小。但是,Selenium仍然没有单击我希望它单击的项目,但出于某种原因,测试似乎通过了。我临时使用
    System.out.println(lnkMenuItem)
    更改了单击操作,只是为了查看它打印出的内容,而且它似乎没有通过过滤元素来获取文本中包含字符串的元素。输出
    [[ChromeDriver:chromeonxp(83b9616db542e5acbccdd66f6c81fdee)]->css选择器:ul.container-content>li:n类型(1)>ul>li>a]
    尝试在
    btnMegaMenu.单击()后添加长睡眠用于调试目的,以查看是否需要等待加载。我尝试将等待包装提高到10秒,并在第一次单击操作后按照您的建议添加睡眠。还是没什么。我的CSS选择器可能有问题吗?