Java 无法在列表中的列表中单击WebElement
我有一个WebElements列表,我打算使用streams()对其进行筛选,然后将每个元素与字符串匹配,最后单击该元素。到目前为止,我还无法调试这个小问题,可以借助StackOverflow社区的briliant minds 我的页面对象类由以下内容组成: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
@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å 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选择器可能有问题吗?