2017-12-26 2 views
1

Ich automatisiere amazon.com, und ich versuche gerade, zu einem bestimmten Element in einem Dropdown-Menü zu bewegen. Egal wie spezifisch ich meinen XPath für dieses Element mache, WebDriver wird nur die Maus zum ersten Element in der Liste bewegen. HierSelenium WebDriver Java - Maus bewegt sich auf falsches Element

ist der HTML-Code:

<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>            

Hier ist meine Automatisierungscode:

@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); 

ich andere XPaths auch versucht haben, die verschiedenen Markierungen in den HTML-Code versehen mit, keine in Anspruch nehmen. WebDriver wird nur zum ersten Element (Aria-Label "Amazon Video") und nicht zu den anderen aufgelisteten Elementen verschoben.

Interessanterweise gibt es keine Probleme, wenn ich eine for-Schleife verwenden, um durch alle Elemente in dem Menü zu wechseln.

+0

Was passiert genau? Irgendwelche Fehler, wenn Sie versuchen, die Maus zu den anderen Menüpunkten zu bewegen? – alecxe

+1

Was ich denke, es gibt mehrere Elemente mit dem gleichen XPath. So Selen, standardmäßig Maus bewegt sich auf das erste identifizierte Element mit diesem Xpath (in der Regel das oberste Element im DOM). Wir können den Index im X-Pfad verwenden, um auf das spezielle Auftreten des XPath hinzuweisen. –

+0

Bitte lesen Sie, warum ein [** 'Screenshot von HTML oder Code oder Fehler eine schlechte Idee ist '**] (https://meta.stackoverflow.com/questions/303812/discourage-screenshots-of-code-and-or Fehler). Erwägen Sie, die Frage mit formatierten textbasierten HTML- und Code-Tests zu aktualisieren. – DebanjanB

Antwort

0

Es wird zum ersten Element im Dropdown-Menü gewechselt, da alle Elemente der Unterkategorien geladen werden, wenn wir zum ersten Element in der Liste gehen.

Um dies zu umgehen, müssen wir zum ersten Element gehen, bevor wir zu anderen Elementen in der Liste gehen. Ich habe eine Methode zur Lösung Ihres Problems erstellt. Übergeben Sie den Namen des Untermenüs, wird es im Untermenü angezeigt.

Der Code ist unten angegeben.

@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"); 

} 

Die offene Methode Code Untermenü hier ist,

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()); 
     } 

} 

Es ist für mich gut funktioniert. Überprüfen Sie und lassen Sie mich wissen, wenn irgendwelche Schwierigkeiten.

+0

Wunderbar, funktioniert super! Danke dass du dir die Zeit nimmst. –

0

Wenn Sie die großen Websites wie amazon.com automatisieren, stellen Sie bitte sicher, dass das Element keinen untergeordneten Knoten hat, wenn Sie versuchen, es durch Firebug zu überprüfen, und manchmal hängt es vom Browser selbst sicher, dass Sie verwenden neueste Webbrowser-Version.

+0

Vielen Dank für Ihre Eingabe !. Ich habe die neuesten Versionen verwendet, immer noch ausgebrannt, dass der neue Firefox, Entwickler-Zusatz, nicht über die FirePath-Funktion verfügt ... –

Verwandte Themen