我一直在寻找答案,但是现在我很无助。 我正在使用Selenium开发项目,以通过使用Page对象模式来为我们的Web应用程序实现自动化。 我注意到有些地方可能可以通过应用程序上的GUI改进更改框架。这是我有一些主菜单,在该主菜单中有每个记录的子菜单(在悬停或单击记录后显示子菜单) 我的应用程序非常适合客户的要求,并且我想确保我的框架尽可能灵活,以适应其他环境配置。最主要的区别在于主菜单和子菜单中元素的顺序以及元素与相应子菜单的对齐方式。 我目前正在菜单中的元素之间进行迭代,并根据元素的名称将此元素分配给相应的WebElement,但是当我想在子菜单中分配元素时,它可以正常工作,但无法单击此元素。 我一直在寻找Java的一些答案,但未将方法的引用传递给我,但还没有找到解决方案/解决方法 我将以代码形式向您展示: 我用Cucumber定义测试方法
public void goToStudentDatA(){
mainPage = new MainPage(base.driver)
mainPage.NavigateToPage(mainPage.StudentData, Common.Category.Informations
}
StudentaData是MainPage中的WebElement,导航到我想去的表单 navigationToPage是一种基于Common.Category.Informations的方法,将信息悬停在特定元素上,以便可以显示subMenu
public void NavigateToPage(WebElement page, Common.Category category)
{
switch(category)
{
case Informations:
this.DisplayHiddenList(this.driver,this.Informations);
break;
}
page.click();
}
在displayHiddenList中,我有一个条件,可以在子菜单信息中查找元素,然后根据子菜单中元素的名称分配正确的元素(菜单记录中存储了子菜单中很少的元素) 因此在DisplayHiddenList之后,我的元素mainPage.StudentData指向具有正确XPath的webElement(并且确实如此),但是在方法NavigateToPage中,页面对象仍然没有引用(它是WebElement,因此其find方法表明在debug中:代理元素用于: DefaultElementLocator'通过id或名称“ Student_Data”',因此显然无法在页面上找到它。 您对如何更改“页面”实例有什么建议吗?它会刷新吗?页面是通过方法GoToStudentData()传递的MainPage.StudentData(WebElement)的实例。
我知道Java通过值传递非基本变量,但是我认为有一些解决方法? 主要原因是在MainPage类中消除了@FindBy注释,因为MainPage表示导航栏,主菜单。
编辑1:displayHiddenList
public void displayHiddenList(WebDriver driver, WebElement
listToDisplay)
{
//buildperform is hovering menu so submenu is visible
Actions act = new Actions(driver);
act.moveToElement(listToDisplay).build().perform();
//Functionality for adding elements based on their hierarchy in DOM
//relatively to passed element listToDisplay
WebElement menuDiv =
listToDisplay.findElement(By.ByXPath.xpath("following-sibling::div"));
List<WebElement> listToDisplayMenu =
menuDiv.findElements(By.ByClassName.className("rmLink"));
//DisplayMenuList lftMenuListItem;
for (WebElement element : listToDisplayMenu)
{
LeftMenuList category =
LeftMenuList.valueOf(listToDisplay.getText().replace(" ", "_"));
switch (category)
{
case Student:
StudentList stdListItem =
StudentList.valueOf(element.getText().replace(" ",
"_").replace("/","_"));
switch (stdListItem)
{
case Data:
Student_Data = element;
//!! If i would click here Student_Data or element it
//is ok so field is updated but page variable in
//NavigateToPage method is not referencing to this
//field
break;
}
}
}
}
Edit2:临时解决方案 我做了一个解决方法,而不是在测试方法中调用类字段,而是通过枚举类型传递要导航的元素名称,然后在NavigateToPage方法中搜索相同的元素,如果找到该元素,则单击该元素
但我仍然想知道我的问题的答案,是否有一些类似C#的变通办法,其中存在引用传递。 我正在传递指向私有字段的对象,在更改此实例的私有字段后,传递的对象不会更改其状态。
EDIT3完成 问题是我一直在错误地使用对类实例的引用,我一直在传递引用,但是我的私有字段元素已更新,因此它指向另一个地址,因此变量仍指向同一元素。我在Edit2#中使用了解决方案来克服这一点,对我来说这已经足够了。感谢您的帮助!
答案 0 :(得分:0)
您的问题让我有些困惑,您无法单击子菜单,但是可以找到它们?请提供一些示例HTML。
您可以尝试使用:
driver.switchTo().activeElement();
在单击元素之前。另外,带有“ option”标签的HTML下拉菜单也不难处理,但每个站点的每个站点都会有所不同。
另一个猜测是该元素已过时。导航菜单时,元素属性可以更改(即打开或禁用的属性),并且在某些情况下,硒不能再处理这些元素,除非再次找到它们。
这里有一个post可能会对您有所帮助,请发布您的HTML。
WebElement mySelectElm = driver.findElement(By.id("mySelectID"));
Select mySelect= new Select(mySelectElm);
selMySelect.selectByVisibleText("Option");