2017-12-26 14 views
1

私はamazon.comを自動化していますが、現在ドロップダウンメニューの特定の要素に移動しようとしています。どのようにしてこの要素のxpathを作成しても、WebDriverはリスト内の最初の項目にマウスを移動するだけです。ここでSelenium WebDriver Java - マウスが間違った要素に移動する

は、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); 

ノーに、htmlコードに設けられた各種ラベルを使用して、同様に他のXPathを試してみました利用可能。 WebDriverは最初の要素(aria-label "Amazon Video")のみに移動し、他の要素はリストされません。

興味深いことに、forループを使用してメニュー内のすべての項目を移動すると、問題はありません。

+0

正確に何が起こっていますか?マウスを他のメニュー項目に移動しようとするとエラーが発生しますか? – alecxe

+1

私はそれを推測すると、同じxpathを持つ複数の要素があります。したがって、セレンは、デフォルトでマウスがそのxpath(通常はDOMのトップエレメント)で最初に特定された要素に移動します。 xpathの特定の出現を指摘するために、xpathの索引を使用することができます。 –

+0

[**スクリーンショットのHTMLまたはコードまたはエラーが悪い理由です**](https://meta.stackoverflow.com/questions/303812/discourage-screenshots-of-code-and-or) - エラー)。フォーマットされたテキストベースのHTMLおよびコードトライアルで質問を更新することを検討してください。 – DebanjanB

答えて

0

リストの最初の要素に移動すると、サブカテゴリのすべての要素がロードされているため、ドロップダウンの最初の要素に移動しています。

これを解決するには、リストの他の要素に移動する前に最初の要素に移動する必要があります。私はあなたの問題を解決するための一つの方法を作りました。サブメニュー名を渡すと、サブメニューに移動します。

コードは次のとおりです。

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

} 

です。何か問題があるかどうかを確認して教えてください。

+0

素晴らしい、素晴らしい作品!時間を割いていただきありがとうございます。 –

0

amazon.comのような大きなサイトを自動化するときは、ファイルノードで子ノードがないことを確認してください。また、ブラウザ自体に依存することもあります。最新のWebブラウザのバージョン。

+0

ありがとうございました!私は最新のバージョンを使用していますが、新しいFirefox、Developer AdditionにはFirePath機能がないことがまだまだ不満です... –

関連する問題