在输入上调用SendKeys时出现Ocasional InvalidElementStateException或ElementNotVisibleException

时间:2017-02-12 00:27:13

标签: c# selenium selenium-webdriver

我有这段代码:

IWebDriver driver = new FirefoxDriver();
driver.Manage().Window.Maximize();
driver.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(30));
//Go to the powerbi site
driver.Navigate().GoToUrl("https://powerbi.microsoft.com/en-us/");
//Go to the page with login form
driver.FindElement(By.XPath("html/body/div[2]/header/nav/div/ul[3]/li[1]/a")).Click();
//Fill in email field
driver.FindElement(By.XPath("//*[@id='cred_userid_inputtext']")).SendKeys("example@gmail.com");

当我在计算机上启动此代码时,一切正常,没有错误。但是,当我在老板的电脑上启动此代码时,有时它会起作用,有时它也不会。

发生错误时,它始终位于最后一行代码中。我不记得确切的错误:InvalidElementStateException(未启用目标元素时)或ElementNotVisibleException(当目标元素不可见时)。

我想整个事情都在于Click()方法。 documentation说:

  

单击此元素。如果单击导致加载新页面,则Click()方法将尝试阻止,直到页面加载完毕。

我不太明白它是如何阻止的。

2 个答案:

答案 0 :(得分:0)

好像您单击按钮后输入并不总是准备就绪。 您应该在发送密钥之前等待它:

试试这个而不是你的最后一行:

WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
var input = wait.Until(ElementIsClickable(By.XPath("//*[@id='cred_userid_inputtext']")));
input.SendKeys("example@gmail.com");

为了进行该检查,您应该创建一个ElementIsClickable函数,该函数返回一个委托,就像this answer所示:

public static Func<IWebDriver, IWebElement> ElementIsClickable(By locator)
{
    return driver =>
    {
        var element = driver.FindElement(locator);
        return (element != null && element.Displayed && element.Enabled) ? element : null;
    };
}

另外,请注意,要使用WebDriverWait课程,您可能需要将Selenium.WebDriverSelenium.Support个软件包导入到项目中,就像this answer建议的那样。< / p>

答案 1 :(得分:0)

It's coming occasional because sometimes it takes time to load element from DOM and which cause exception like InvalidElementStateException or ElementNotVisibleException. I ran your snippets code. It runs fine, try to separate action and find element.

WebElement element = driver.findElement(By.xpath(".//xyz"/);
element.sendkeys("data");

This could work.