Selenium:查找HTML5列表元素

时间:2014-07-19 23:25:12

标签: c# asp.net selenium selenium-webdriver gui-testing

从下面的html(这是下拉菜单的一部分),我需要找到元素" Hello World"并单击链接

<li data-name="Tools Menu"> <a href="javascript:void(0);">Tools</a>
    <ul>
          <li data-name="Test Menu"><a href="/Menu/Index">Test</a>
          </li>
          <li data-name="Hello World"><a href="/HelloWorld/Hello">Hello World</a>
          </li>
    </ul>
</li>

到目前为止,我有以下代码:

ieDriver.Manage().Timeouts().ImplicitlyWait(new TimeSpan(0, 0, 3));
var elements = ieDriver.FindElement(By.CssSelector("[data-name=\"Hello World\"]"));
elements.Click();

然而,它失败了以下例外:

OpenQA.Selenium.ElementNotVisibleException : Cannot click on element

2 个答案:

答案 0 :(得分:0)

我不确定但你是否有可能点击错误的元素?

<li data-name="Hello World">
    <a href="/HelloWorld/Hello">Hello World</a>
</li>

[data-name=\"Hello World\"]

所以你点击li-tag而不是a-tag,导致你搜索一个名为&#34; data-name&#34;的属性。

也许这就是问题?

祝你好运

答案 1 :(得分:0)

这里的问题是你的代码处理速度比页面的处理速度快,在处理页面中的JS或下拉菜单时会发生很多事情。我建议使用以下代替driver.FindElement方法:

    public static IWebElement WaitForElementPresent(this IWebDriver driver, By by)
    {
        try
        {
            return new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(x => x.FindElement(by));
        }
        catch (WebDriverTimeoutException exception)
        {
            throw new AssertionException(string.Format("Element {0} was not found. Page source: {1}{2}",
                                                       by,
                                                       Environment.NewLine,
                                                       driver.PageSource),
                                                       exception);
        }
    }

在处理Click()方法之前,它基本上会等到元素可见。