我有这段代码:
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()方法将尝试阻止,直到页面加载完毕。
我不太明白它是如何阻止的。
答案 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.WebDriver
和Selenium.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.