我已经在Selenium上乱了很长时间了。所以,我想我会创建一个很好的简单例子,希望硒专家可以告诉我:
在本练习中,我创建了一个简单的控制台应用程序,以便登录图书馆网站。显然,用户名和密码不正确。但事实是,我在下面提供的代码甚至无法在页面上可见的文本框中键入字符:
static void Main(string[] args)
{
ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService(@"E:\");
var chromeOptions = new ChromeOptions();
chromeDriverService.Port = 7788;
var driver = new ChromeDriver(chromeDriverService, chromeOptions);
var nav = driver.Navigate();
nav.GoToUrl("http://sapln.ent.sirsidynix.net.au/client/charlessturt/");
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementExists(By.CssSelector("#libInfoContainer > div.loginLink > a"))).Click();
wait.Until(ExpectedConditions.ElementExists(By.Id("j_username"))).SendKeys("gfhjdskaf");
wait.Until(ExpectedConditions.ElementExists(By.Id("j_password"))).SendKeys("gfhdsjffd");
driver.FindElementById("submit_0").Click();
Console.ReadKey();
}
一定要尝试填充该文本框。我很想知道你是如何实现它的。 我正在使用:
答案 0 :(得分:1)
您的对话框在iframe中打开。在您与登录表单元素进行交互之前,您需要切换到该iframe。
我没有测试您的代码,但您可以按照以下示例删除我的评论:
static void Main(string[] args)
{
ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService(@"E:\");
var chromeOptions = new ChromeOptions();
chromeDriverService.Port = 7788;
var driver = new ChromeDriver(chromeDriverService, chromeOptions);
var nav = driver.Navigate();
nav.GoToUrl("http://sapln.ent.sirsidynix.net.au/client/charlessturt/");
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until(ExpectedConditions.ElementExists(By.CssSelector("#libInfoContainer > div.loginLink > a"))).Click();
假设您的iframe是第一个发现的,您可以使用类似......的内容:
driver.switchTo().frame(driver.findElements(By.tagName("iframe").get(0)));
由于您的iframe没有ID,我们无法做到:
driver.switchTo().frame("id of frame");
如果你能给你的iframe一个id,那将非常方便。
现在让我们继续您的代码:
wait.Until(ExpectedConditions.ElementExists(By.Id("j_username"))).SendKeys("gfhjdskaf");
wait.Until(ExpectedConditions.ElementExists(By.Id("j_password"))).SendKeys("gfhdsjffd");
driver.FindElementById("submit_0").Click();
您登录后,需要切换回默认内容
driver.switchTo().defaultContent();
Console.ReadKey();
}
在尝试与对话框交互之前,只需注入iframe开关,然后在尝试使用初始页面执行任何其他操作之前在最后注入defaultContent()开关,并且您很好。
祝你好运!