2

我有一个网站,我正在尝试自动化我可以登录并点击其中一个菜单,但是当我点击第三个孩子时我遇到了问题

假设我有一个主菜单,它显示子菜单,单击子菜单它显示第三个菜单,其中有 10 个以自上而下的顺序显示的链接,我点击了我无法执行的第 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

我会建议解决这个问题的两种方法

方法 1:从上面的代码中,我看到为 Level1 菜单项和 Level2 菜单项定义了点击事件。而是直接引用2级项目而不点击1级项目,如下图:

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# 代码片段和亚马逊网站)

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

这是亚马逊网站的示例,最初它首先单击顶部菜单,然后单击 Item1 (level1),然后通过 TopMenu 通过 Level1 单击 Item2

我希望这会有所帮助....一切顺利:)

于 2012-11-21T10:40:59.610 回答