(Selenium WebDriver)菜单点击通过,但页面上没有任何反应

时间:2017-06-05 21:36:28

标签: javascript selenium xpath

我正在为一个旧的“infragistics”编写一个硒C#测试代码(我对这个问题不太了解)页面。在元素引用方面,该页面没有给出那么多选项。就像下面的HTML一样,我想点击INVENTORY,它是一个菜单项的子菜单,但是没有元素Id或Name,所以我使用了XPath(参见下面的代码)。看起来webdriver识别出xpath,但是当click函数执行并完成时,页面上没有任何反应。它不会打开预期的页面。有什么我在这里做错了吗?

<li class="igdm_MenuItemVertical igdm_MenuItemVerticalParent " unselectable="on" data-ig="x:1171509256.11:adr:1.2" adr="1.2"><A onclick="{return false;}" tabIndex=-1 class="igdm_MenuItemVerticalLink " href="#/Inventory...">
<a onclick="{return false;}" tabIndex=-1 class="igdm_MenuItemVerticalLink>
<img class="igdm_MenuItemVerticalIcon " alt="   Inventory..." src="../Images/report16.gif">
<span tabIndex=-1 unselectable="on"> INVENTORY...</span>
</a>

代码:

private By FileSubMenu = By.XPath(".//li/a/span[text()=' Inventory...']");

    public HomePage SubMenu()
    {
        int retryCount = 0;
        while (true && retryCount < Constants.RETRY_COUNT)
        {
            try
            {
                Thread.Sleep(3000);
                IWebElement element = _driver.FindElement(FileSubMenu);
                Actions Rmouseover = new Actions(_driver);
                Rmouseover.MoveToElement(element).Click().Perform();
                return this;
            }
            catch (Exception ex) when (ex is WebDriverTimeoutException || ex is TimeoutException)
            {
                retryCount++;
                Thread.Sleep(3000);
            }
        }
        return this;
    }

1 个答案:

答案 0 :(得分:0)

XPath是可以的,但我更喜欢CSS Selector,因为它倾向于使用较少的脆弱选择器(基于DOM的位置不是这样,但仍然可以)。要在Chrome中获得一个:

  1. 右键点击元素,然后选择&#39;检查&#39;
  2. 右键单击DevTools的DOM资源管理器中的元素
  3. 选择&#34;复制&#34; &GT; &#34;复制选择器&#34;
  4. 那么你的代码看起来像是:

    IWebElement element =  driver.FindElement(By.CssSelector("paste_the_selector_here"));
    // Click via Selenium's Click method
    element.Click();
    // Or, click via JavaScript
    ((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click()", element);
    

    此外,您可能不想点击<span>,而是点击<a>,因为它有一个onclick事件监听器。

    如果选择器包含动态父级的ID,那么您将要删除它。要删除它,请在DevTool的“元素”选项卡中找到具有该ID的元素。双击id="..."部分并删除整个内容。现在获取子元素的选择器。

    这个例子

    <div id="ctl00_NavBarAdmin_WebDataMenu1"> // <- Parent div html
    #ctl00_NavBarAdmin_WebDataMenu1 > ul > li:nth-child(2) > ul > li.igdm_MenuItemVertical.igdm_MenuItemVerticalParent.igdm_Me‌​nuItemVerticalSelect‌​ed > a
    

    可能会成为

    <div> // <- Parent div HTML
    div > ul > li:nth-child(2) > ul > li.igdm_MenuItemVertical.igdm_MenuItemVerticalParent.igdm_Me‌​nuItemVerticalSelect‌​ed > a