Java 如何在Selenium中打印没有任何属性的子菜单链接
我是selenium新手,尝试使用列表打印链接文本 我试图从一个演示站点获取文本,但是定位器上没有任何单一属性。所以请帮帮我。下面是我执行的详细信息 网站网址: 菜单:产品>产品下的所有子菜单(共找到9个链接),但无法打印这9个链接的文本 截图1: 截图2: 我所做的代码:Java 如何在Selenium中打印没有任何属性的子菜单链接,java,selenium,selenium-webdriver,Java,Selenium,Selenium Webdriver,我是selenium新手,尝试使用列表打印链接文本 我试图从一个演示站点获取文本,但是定位器上没有任何单一属性。所以请帮帮我。下面是我执行的详细信息 网站网址: 菜单:产品>产品下的所有子菜单(共找到9个链接),但无法打印这9个链接的文本 截图1: 截图2: 我所做的代码: public void OpenStoreDemo() { List<WebElement> MainMenu = driver.findElements(By.xpath("//ul[@class
public void OpenStoreDemo() {
List<WebElement> MainMenu = driver.findElements(By.xpath("//ul[@class='top-menu']/li[1]//a"));
System.out.println(MainMenu.size());
for (WebElement list : MainMenu) {
String getname = list.getText();
System.out.println(getname);
if (getname.equals("Store demo")) {
System.out.println("Pass");
}
else {
System.out.println("Not Found");
}
break;
}
}
public void OpenStoreDemo(){
List MainMenu=driver.findElements(By.xpath(“//ul[@class='top-menu']]/li[1]//a”);
System.out.println(main menu.size());
用于(WebElement列表:主菜单){
字符串getname=list.getText();
System.out.println(getname);
if(getname.equals(“存储演示”)){
系统输出打印项次(“通过”);
}
否则{
System.out.println(“未找到”);
}
打破
}
}
试试这个:
// to make 'Store demo' button visible, hover to 'product' button
Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.xpath("//ul[@class = 'top-menu']/li[1]/a")));
actions.perform();
// wait until 'Store demo' button will be clickable
new WebDriverWait(webDriver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//ul[@class = 'top-menu']/li[1]/ul/li[4]/a")));
// locate element
WebElement storeDemoBtn = driver.findElement(By.xpath("//ul[@class = 'top-menu']/li[1]/ul/li[4]/a"));
System.out.println(storeDemoBtn.getText()); // will print 'Store demo'
以下代码可能对您有所帮助
public void OpenStoreDemo() {
boolean isFound = false;
WebElement MainMenuProduct = driver.findElement(By.xpath("//ul[@class='top-menu']/li[1]/a"));
new Actions(driver).moveToElement(MainMenuProduct).perform();
List<WebElement> lstProductSubmenu =driver.findElements(By.xpath("//ul[@class='top-menu']/li[1]//ul/li/a"));
for (WebElement list : lstProductSubmenu) {
String getname = list.getText();
System.out.println(getname);
if (getname.equals("Store demo")) {
System.out.println("Pass");
isFound = true;
break;
}
}
if(!isFound)
System.out.println("not found");
}
public void OpenStoreDemo(){
布尔值isFound=false;
WebElement MainMenuProduct=driver.findElement(By.xpath(“//ul[@class='top-menu']]/li[1]/a”);
新操作(驱动程序).moveToElement(主菜单根目录).perform();
List lstProductSubmenu=driver.findElements(By.xpath(“//ul[@class='top-menu']]/li[1]//ul/li/a”);
用于(WebElement列表:lstProduct子菜单){
字符串getname=list.getText();
System.out.println(getname);
if(getname.equals(“存储演示”)){
系统输出打印项次(“通过”);
isFound=true;
打破
}
}
如果(!isFound)
System.out.println(“未找到”);
}
您可以使用JS方法从隐藏的webelement获取文本,并使用dataprovider检查菜单项是否已启用,可能如下所示:
@DataProvider
public Object[][] getProductMenu() {
return new Object[][]{
{"What is nopCommerce"},
{"Why nopCommerce"},
{"Features"},
{"Store demo"},
{"Showcase"},
{"Case studies"},
{"Roadmap"},
{"Copyright notice removal"},
{"License"}
};
}
@Test(dataProvider = "getProductMenu")
public void checkProductMenu(String menuItemName) {
driver.get("https://www.nopcommerce.com/");
// check if menu item is enabled
Assert.assertTrue(isMenuItemExistInMenu(menuItemName));
}
public boolean isMenuItemExistInMenu(String menuItemName) {
List<WebElement> menuItemsElements = driver.findElements(By.xpath("//ul[@class='top-menu']/li[1]//ul/li/a"));
for (WebElement menuItemsElement : menuItemsElements) {
if (getHiddenTextByWebElement(menuItemsElement).equals(menuItemName)) {
System.out.println("Menu item [" + menuItemName + "]" + " is enabled in Product submenu");
return true;
}
}
return false;
}
//this is JS method for get hidden text from WebElement
private String getHiddenTextByWebElement(WebElement element) {
try {
return (String) driver.executeScript("return arguments[0].innerHTML", element);
} catch (Exception e) {
Assert.fail("Can't return hidden text, occur error: \n" + e.getMessage());
return "";
}
}
@DataProvider
公共对象[][]getProductMenu(){
返回新对象[][]{
{“什么是商业”},
{“为什么没有商业”},
{“功能”},
{“商店演示”},
{“展示”},
{“案例研究”},
{“路线图”},
{“版权声明删除”},
{“许可证”}
};
}
@测试(dataProvider=“getProductMenu”)
公共无效检查产品菜单(字符串菜单项名称){
驱动程序。获取(“https://www.nopcommerce.com/");
//检查菜单项是否已启用
Assert.assertTrue(isMenuItemExistInMenu(menuItemName));
}
公共布尔值isMenuItemExistInMenu(字符串menuItemName){
List menuItemsElements=driver.findElements(By.xpath(“//ul[@class='top-menu']]/li[1]//ul/li/a”);
对于(WebElement menuItemsElement:menuItemsElements){
if(getHiddentTextByWebElement(menuItemsElement).equals(menuItemName)){
System.out.println(“在产品子菜单中启用了菜单项[“+menuItemName+”]“+”);
返回true;
}
}
返回false;
}
//这是从WebElement获取隐藏文本的JS方法
私有字符串getHiddenTextByWebElement(WebElement元素){
试一试{
返回(字符串)驱动程序.executeScript(“返回参数[0].innerHTML”,元素);
}捕获(例外e){
Assert.fail(“无法返回隐藏文本,出现错误:\n”+e.getMessage());
返回“”;
}
}
这种xpath的用途是什么://*[@id='aspnetForm']/div[3]/div[2]/ul/li[1]/a@cruisepandey添加了一个较短的版本。我在打印子菜单链接时遇到问题,等待不是解决方案。当我打印产品菜单下的文本时,每次它都打印空白而不是文本。我只需要打印产品菜单下的文本。此行出现错误“类型不匹配:无法从WebElement转换为列表”。List lstProductSubmenu=driver.findElement(By.xpath(“//ul[@class='top-menu']]/li[1]//ul/li/a”);对不起,是findElement,不是findElement。更新答案<代码>列表lstProductSubmenu=driver.findElements(By.xpath(“//ul[@class='top-menu']]/li[1]//ul/li/a”)@Murthi当我在Eclipse上运行它时,这个代码打印未找到
。得到了解决方案,删除其他部分并断开,它会工作的。谢谢@Murthi@Murthi,您可以尝试使用动态XPath,因为如果开发人员在代码中添加任何UL或LI,当前路径可能会中断。参见此//ul[@class='top-menu']/li[1]//ul//a