2

自動化しようとしている Web サイトがあります。ログインしてメニューの 1 つをクリックすることはできますが、3 番目の子をクリックすると問題に直面します。

サブメニューを表示するメインメニューがあり、サブメニューをオンクリックすると、10個のリンクが上から下に表示される3番目のメニューが表示され、9番目の子をクリックすることはできません。

以下はコードです:

WebElement myElement1 = driver.findElement(By.xpath("/html/body/form/div[5]/div/div[2]/table/tbody/tr/td[2]/div/div/ul/li/ul/li[2]/span/span/span"));
Actions builder = new Actions(driver);
builder.moveToElement(myElement1).build().perform();
myElement1.click();

WebElement myElement2 = driver.findElement(By.xpath("/html/body/form/div[5]/div/div[2]/table/tbody/tr/td[2]/div/div/ul/li/ul/li[2]/ul/li/span/span/span"));
Actions builder1 = new Actions(driver);
builder1.moveToElement(myElement2).build().perform();
myElement2.click();

WebDriverWait wait = new WebDriverWait(driver, 40);
WebElement ele = driver.findElement(By.xpath("/html/body/form/div[5]/div/div[2]/table/tbody/tr/td[2]/div/div/ul/li/ul/li[2]/ul/li/ul/li[9]/a/span/span"));
System.out.println(ele.getText());

WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("/html/body/form/div[5]/div/div[2]/table/tbody/tr/td[2]/div/div/ul/li/ul/li[2]/ul/li/ul/li[9]/a/span/span")));
System.out.println(" about to get enter time sheet" + element.getText());
System.out.println(isElementPresent(By.xpath("/html/body/form/div[5]/div/div[2]/table/tbody/tr/td[2]/div/div/ul/li/ul/li[2]/ul/li/ul/li[9]/a/span/span")));
driver.manage().timeouts().implicitlyWait(2500, TimeUnit.SECONDS);
org.openqa.selenium.Point coordinates = driver.findElement(By.xpath("/html/body/form/div[5]/div/div[2]/table/tbody/tr/td[2]/div/div/ul/li/ul/li[2]/ul/li/ul/li[9]/a/span/span")).getLocation();
System.out.println(coordinates.getX() + " " + coordinates.getY());
WebElement myElement3 = driver.findElement(By.xpath("/html/body/form/div[5]/div/div[2]/table/tbody/tr/td[2]/div/div/ul/li/ul/li[2]/ul/li/ul/li[9]/a/span/span"));
Actions builder3 = new Actions(driver);
builder3.moveToElement(myElement3).build().perform();
myElement3.click();

最後のドロップダウンは、失敗する場所です。

4

1 に答える 1

0

Selenium 2.0 について提出された同様の種類のバグがあり、クローズされました。Selenium の最新の安定ビルドを参照してください。

以下の 2 つのレベルのメニュー ドロップダウン メニューを参照してください。

Menu
  Item 1
      SubItem1
      SubItem2
  Item 2

この問題に対する2つのアプローチを提案します

アプローチ 1:上記のコードから、Level1 メニュー項目と Level2 メニュー項目に対して定義されたクリック イベントがあることがわかります。代わりに、以下に示すように、レベル 1 のアイテムをクリックせずに、レベル 2 のアイテムを直接参照します。

Menu.click();
Actions Build = new Actions(driver);
Build.moveToElement(Menu).moveToElement(Item1).moveToElement(SubItem2).click().build().perform();

アプローチ 2 JavaScript の方法ですが、ページ上のメニュー項目をクリックするのが安全な回避策です。

js.ExecuteScript("return $(\"a:contains('Menu')\").mouseover();");
js.ExecuteScript("return $(\"a:contains('Item1')\").next(':eq(1)').mouseover();");
driver.FindElement(By.LinkText("SubItem2")).Click();

アプローチ 1 の実際の例を次に示します... (C# コード スニペットと Amazon ウェブサイト)

        IWebDriver driver = new InternetExplorerDriver();
        driver.Navigate().GoToUrl("http://www.amazon.com/gp/goldbox/ref=cs_top_nav_gb27");
        driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(10));

        IWebElement Menu = driver.FindElement(By.Id("nav-bar-inner")).FindElement(By.Id("nav-shop-all-button"));
        Menu.Click();

        IWebElement Item1 = driver.FindElement(By.Id("nav_cat_4"));
        Actions Build = new Actions(driver);
        Build.MoveToElement(Menu).MoveToElement(Item1).Click().Build().Perform();

        IWebElement SubItem = driver.FindElement(By.Id("nav_subcats_4")).FindElement(By.LinkText("Games"));
        Build.MoveToElement(Menu).MoveToElement(Item1).MoveToElement(SubItem).Click().Build().Perform();

これはAmazonサイトの例です。最初にトップメニューをクリックし、次にItem1(レベル1)をクリックし、次にTopMenuを介してLevel1を介してItem2をクリックします

これがお役に立てば幸いです....よろしくお願いします:)

于 2012-11-21T10:40:59.610 に答える