代码之家  ›  专栏  ›  技术社区  ›  J91

Selenium WebDriver Java--鼠标移动到错误的元素

  •  2
  • J91  · 技术社区  · 7 年前

    我正在自动化亚马逊。com,我目前正在尝试移动到下拉菜单中的特定元素。无论我为这个元素设置了多么具体的xpath,WebDriver都只会将鼠标移动到列表中的第一项。

    以下是HTML代码:

    <div class="nav-template nav-flyout-content nav-tpl-itemList">                            
    <span class="nav-hasPanel nav-item" data-nav-panelkey="InstantVideoPanel" role="navigation" aria-label="Amazon Video">                          
    <span class="nav-text">Amazon Video</span>                          
    </span>                                             
     <span class="nav-hasPanel nav-item" data-nav-panelkey="DigitalMusicPanel" role="navigation" aria-label="Amazon Music">                          
     <span class="nav-text">Amazon Music</span>                          
     </span>                                              
     <span class="nav-hasPanel nav-item" data-nav-panelkey="AndroidPanel" role="navigation" aria-label="Appstore for Android">                          
     <span class="nav-text">Appstore for Android</span>                          
     </span>                                              
    

    这是我的自动化代码:

    @Test
    public void departmentsDropMusic1() throws Exception {
    
        driver = new FirefoxDriver();
    
        driver.get("https://www.amazon.com");
        Thread.sleep(3000L);
    
        WebElement element = driver.findElement(By.xpath("//a[@id='nav-link-shopall']"));
    
        Actions action = new Actions(driver);
    
        action.moveToElement(element).build().perform();
        Thread.sleep(3000L);
    
    
        WebElement dropDown = driver.findElement(By.cssSelector("#nav-flyout-shopAll > div:nth-child(2)"));
    
        if (dropDown.isDisplayed()) {
    
            System.out.println("pass");
        } else {
    
            Assert.fail();
        }
        WebElement musicSubMenu = driver.findElement(By.xpath(//span[contains(text(), 'Amazon Music')]"));
    
    
        action.moveToElement(musicSubMenu).build().perform();
        Thread.sleep(3000L);
    

    我也尝试过其他XPath,使用html代码中提供的各种标签,但都没有用。WebDriver将只移动到第一个元素(aria标签“Amazon视频”),而不移动列出的其他元素。

    有趣的是,当我使用for循环遍历菜单中的所有项目时,没有问题。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Murthi    7 年前

    当我们移动到列表中的第一个元素时,它正在移动到下拉列表中的第一个元素,因为子类别的所有元素都在加载。

    为了克服这个问题,我们需要先移动到第一个元素,然后再移动到列表中的任何其他元素。我已经创建了一种方法来解决您的问题。如果传递子菜单名称,它将在子菜单上移动。

    代码如下所示。

    @Test
    public void departmentsDropMusic1() throws Exception {
    
        System.setProperty("webdriver.gecko.driver", "C:\\Projects\\SeleniumDrivers\\geckodriver.exe");
    
        driver = new FirefoxDriver();
    
        driver.get("https://www.amazon.com");
        Thread.sleep(5000L);
    
        openSubMenu("Amazon Music");
    
        openSubMenu("Fire TV");
    
    }
    

    打开子菜单方法代码在此处,

    public void openSubMenu(String menu) throws InterruptedException{
    
    
           //mouse over on Main menu 'Departments'
            WebElement element = driver.findElement(By.xpath("//a[@id='nav-link-shopall']"));
    
            Actions action = new Actions(driver);
    
            action.moveToElement(element).build().perform();
            Thread.sleep(5000L);
    
            //verify sub menus are listed or not
            WebElement dropDown = driver.findElement(By.cssSelector("#nav-flyout-shopAll"));
    
            if (dropDown.isDisplayed()) {
                System.out.println("pass");
    
            } else {
    
                Assert.fail();
            }
    
            //
            WebElement subMenu1 = driver.findElement(By.cssSelector("#nav-flyout-shopAll > div.nav-tpl-itemList>span:nth-child(1)"));
            WebElement subMenuWantedToOpen = driver.findElement(By.cssSelector("#nav-flyout-shopAll > div.nav-tpl-itemList>span[aria-label='"+menu.trim()+"']"));
    
            action.moveToElement(subMenu1).moveToElement(subMenuWantedToOpen).build().perform();
    
            Thread.sleep(5000L);
    
            WebElement subMenuCat = driver.findElement(By.cssSelector(".nav-subcats > div.nav-subcat[style='display: block;']"));
    
            if(subMenuCat.isDisplayed()){
                System.out.println(subMenuCat.getText());
            }
    
    }
    

    这对我来说很好。如果有任何困难,请检查并告诉我。

        2
  •  0
  •   satya    7 年前

    当你自动化像亚马逊这样的大型网站时。com,请确保元素没有子节点,当您尝试通过firebug检查它时,有时它取决于浏览器本身,请确保您使用的是最新的web浏览器版本。