【问题标题】:(Selenium WebDriver) Menu click pass but nothing happens on page(Selenium WebDriver)菜单单击通过,但页面上没有任何反应
【发布时间】:2017-11-06 18:22:45
【问题描述】:

我正在为旧的“基础设施”(我对此不太了解)页面编写硒 C# 测试代码。在元素引用方面,该页面没有给我太多选择。就像在下面的 HTML 中一样,我想单击 INVENTORY,它是菜单项的子菜单,但没有元素 ID 或名称,所以我使用了 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;
    }

【问题讨论】:

  • 可能是因为您的文字是大写的INVENTORY...,而您正在查看text()=' Inventory...'
  • ACV,我在这里将其设为大写以突出显示我试图点击的内容。在我的代码中它不是大写的。不过感谢您的建议
  • 通常使用子菜单,您首先必须在父菜单上单击或鼠标悬停
  • 是的,父菜单的鼠标悬停功能有效。它就像我遇到问题的子菜单一样,它没有 Id、Name 元素。它与 LinkText 元素查找器一起使用。相同的功能不适用于鼠标悬停或单击的子菜单

标签: javascript selenium xpath


【解决方案1】:

XPath 没问题,但我更喜欢 CSS 选择器,因为它倾向于产生不那么脆弱的选择器(在基于 DOM 的位置上不是这样,但仍然可以)。在 Chrome 中获取一个:

  1. 右键单击元素并选择“检查”
  2. 在 DevTools 的 DOM 资源管理器中右键单击元素
  3. 选择“复制”>“复制选择器”

那么你的代码应该是这样的:

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

此外,您可能不想点击&lt;span&gt;,而是点击&lt;a&gt;,因为它有一个onclick 事件侦听器。

如果选择器包含动态父级的 ID,则您需要将其删除。要删除它,请在 DevTool 的 Element 选项卡中找到具有该 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 

【讨论】:

  • 嘿蒂莫西,我尝试了 CssSelector 的步骤,但我得到:“无法使用 css 选择器找到元素...”。我还尝试单击 我得到“无法使用 css 选择器找到元素...”
  • 如果没有看到 DOM 的其余部分,我会猜测父元素具有动态 ID 属性。如果是这样,请编辑该元素(在 DOM 资源管理器中)并完全删除该属性。然后获取选择器。
  • 抱歉,我不知道该怎么做。这是我复制的 CssSeletor:- #ctl00_NavBarAdmin_WebDataMenu1 > ul > li:nth-child(2) > ul > li.igdm_MenuItemVertical.igdm_MenuItemVerticalParent.igdm_MenuItemVerticalSelected > a
  • 我将用如何删除动态 id 来更新我的答案。
  • 嗨蒂莫西,非常感谢您到目前为止的帮助,如果我没有正确遵循您的指示,我提前道歉。我已经尝试了下面的 CssCelector,但我仍然得到“无法使用 css 选择器找到元素...” private By FileSubMenu = By.CssSelector("div > ul > li:nth-child(2) > ul > li.igdm_MenuItemVertical .igdm_MenuItemVerticalParent.igdm_Me‌​nuItemVerticalSelect‌​ed > a ");
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多