Java 如何在Selenium中打印没有任何属性的子菜单链接

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

我是selenium新手,尝试使用列表打印链接文本

我试图从一个演示站点获取文本,但是定位器上没有任何单一属性。所以请帮帮我。下面是我执行的详细信息

网站网址:

菜单:产品>产品下的所有子菜单(共找到9个链接),但无法打印这9个链接的文本

截图1:

截图2:

我所做的代码:

 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