【问题标题】:Element not visible as both the menu and submenu hidden元素不可见,因为菜单和子菜单都隐藏
【发布时间】:2014-05-09 02:36:42
【问题描述】:

我想打开cric info,然后在子菜单打开时点击“live score”菜单,点击“Desktop scoreboard”。

但问题是实时比分菜单位于隐藏的 div 下。 即这个div在td下

“您可以查看页面结构以获取详细信息”

所以当我尝试使用 driver.findElementBy("xpath") 单击菜单元素时,我得到了元素不可见异常。

所以我直接使用了开发人员 mopen('m2') 使用的 javascript,它完成了打开菜单的工作,但是在此之后,当我执行命令以再次查找子菜单元素时,得到相同的错误“元素不可见异常”。

尝试通过执行 jscript 使 div 可见。

PFB 我使用的代码:

FirefoxDriver d1=new FirefoxDriver();
    d1.get("http://www.cricinfo.com");
    ((JavascriptExecutor) d1).executeScript("mopen('m2')");
    ((JavascriptExecutor) d1).executeScript("document.getElementById('m2').style.visibility='visible';");
    ((JavascriptExecutor) d1).executeScript("document.getElementById('m2').style.display='block';");
    d1.manage().timeouts().implicitlyWait(30,TimeUnit.SECONDS);
    d1.findElementByXPath("//*[@id='mgDdRht']/tbody/tr[3]/td/a").click();

也尝试使用 Actions 类,但一切都是徒劳的,非常感谢帮助 提前致谢。

【问题讨论】:

标签: selenium selenium-webdriver


【解决方案1】:

您应该可以使用Action 链来执行此操作:

Actions builder = new Actions(d1);
Action clickSubMenu = builder.moveToElement(d1.findElement(By.cssSelector(".Nav td:nth-child(2).navLinks")))
    .moveToElement(d1.findElement(By.cssSelector("#m0 td:nth-child(1)#mgDd>table:nth-child(1)>tbody:nth-child(1) td:nth-child(2).PopupTabs")))
    .click(d1.findElement(By.xpath("//*[@id='mgDdRht']/tbody/tr[3]/td/a"))).build();

clickSubMenu.perform();

我在 c# 中对此进行了测试,它对我有用。我将它翻译成 Java,但我可能犯了语法错误。抱歉,如果我有的话。

我发现我需要转移到系列。然后我不得不转向系列 - 下拉版本,因为系列的下拉版本与非下拉版本是不同的元素。然后我可以移动到西印度群岛链接,然后单击它。

【讨论】:

  • 嗨,Richard,我不知道如何使用 cssSelector 查找元素,并且无法使用 xpath 来完成它,就像在 cricinfo 中一样,如果您检查它,所有菜单元素都具有相同的 xpath....在使菜单可见后,您是否有其他解决方案可以单击子菜单,因为所有子菜单都有正确的 xpath....如果我在上面的方法中犯了任何错误,请更正
【解决方案2】:

我终于可以点击子菜单了:)

我上面发布的代码的问题出在子菜单的 xpath 中,即如果你去 cricinfo 并检查不同菜单的子菜单的 xpath,所有的 xpath 都将具有相同的 xpath,因此我们需要通过 html 制作 xpath自己的,因此webdriver将能够区分我们要单击的元素,这将解决单击菜单后单击隐藏子菜单的目的。如果您要单击菜单,则同样适用(构建自己的xpath)

1)点击菜单使用开发者使用的javascript函数,在菜单被触发并且子菜单变得可见后点击元素。

2) 正如 Richard 所建议的,使用 Actions 类来模拟鼠标悬停事件直到根元素,然后我们必须单击子菜单。

1)

FirefoxDriver d1=new FirefoxDriver();
    d1.get("http://www.cricinfo.com");
    ((JavascriptExecutor) d1).executeScript("mopen('m2')");
    d1.manage().timeouts().implicitlyWait(15,TimeUnit.SECONDS);
    d1.findElementByXPath("//div[@id='m2']/table/tbody/tr[2]/td[2]/table/tbody/tr[3]/td/a").click();

2)

     FirefoxDriver d1=new FirefoxDriver();
d1.get("http://www.cricinfo.com");
d1.manage().timeouts().implicitlyWait(15,TimeUnit.SECONDS);
String xpath_root=("//div[@id='m2']/table/tbody/tr[1]/td/table/tbody/tr[1]/td[2]/a");
String xpath_sub=("//div[@id='m2']/table/tbody/tr[2]/td[2]/table/tbody/tr[3]/td/a");
WebElement root=d1.findElementByXPath(xpath_root);
WebElement sub=d1.findElementByXPath(xpath_sub);
Actions builder=new Actions(d1);
builder.moveToElement(root).build().perform();
sub.click();

感谢理查德.....阅读您的解决方案后,我尝试使用操作类。在此之前,我不确定是否可以使用隐藏菜单。

【讨论】:

    猜你喜欢
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多