尝试使用Selenium,创建了一个非常简单的例子
static void Main(string[] args)
{
using (IWebDriver driver = new InternetExplorerDriver())
{
driver.Navigate().GoToUrl("https://gmail.com");
IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(2.00));
wait.Until(d => ExpectedConditions.ElementExists(By.Id("Email")));
Console.WriteLine("Page loaded ...");
IWebElement userNameElt = driver.FindElement(By.Id("Email"));
while (!userNameElt.Displayed)
{
Console.WriteLine("Page not finished loading yet ...");
Thread.Sleep(3000);
}
userNameElt.SendKeys("my@sample.com");
userNameElt.Submit();
IWebElement passwordElt = driver.FindElement(By.Id("Passwd"));
userNameElt.SendKeys("password");
userNameElt.Submit();
IWebElement submitBtnElt = driver.FindElement(By.Id("signIn"));
submitBtnElt.Click();
}
}
但它抱怨无法找到元素
Started InternetExplorerDriver server (64-bit)
2.25.3.0
Listening on port 1423
Page loaded ...
Unhandled Exception: OpenQA.Selenium.NoSuchElementException: Unable to find element with id == Email
任何想法?
答案 0 :(得分:1)
通过你的例子,我会想到几件事。
首先,根据您的网络,等待的超时可能太短。两秒钟可能不够长。撞到十点,看看它是否更稳定。
其次,从等待中丢弃lambda-fu。这是不正确的,你只需要一个简单的
wait.Until(ExpectedConditions.ElementExists(By.Id("Email")));
另外,请记住,您的手册while(!userNameElt.Displayed)循环没有意义。你已经等了上面的那个元素,所以这个循环不应该发挥作用。
最后,在使用SendKeys()之后,您不需要提交()。
这是一个重构的代码块,它是稳定的并且可以解决问题。
using (IWebDriver driver = new InternetExplorerDriver())
{
driver.Navigate().GoToUrl("https://gmail.com");
IWait<IWebDriver> wait = new WebDriverWait(driver, TimeSpan.FromSeconds(2.00));
wait.Until(ExpectedConditions.ElementExists(By.Id("Email")));
driver.FindElement(By.Id("Email")).SendKeys("mysample.com");
wait.Until(ExpectedConditions.ElementExists(By.Id("Passwd")));
driver.FindElement(By.Id("Passwd")).SendKeys("password");
driver.FindElement(By.Id("signIn")).Click();
}