C#硒罐';不能定位到任何元素
为什么C#+Selenium无法仅从该URL定位到任何元素 我想尝试使用c#+selenium以编程方式将数据填充到文本框中。 我曾尝试过一些网站,但效果不错,但只有那个网站不起作用。这是我的密码C#硒罐';不能定位到任何元素,c#,selenium,selenium-webdriver,C#,Selenium,Selenium Webdriver,为什么C#+Selenium无法仅从该URL定位到任何元素 我想尝试使用c#+selenium以编程方式将数据填充到文本框中。 我曾尝试过一些网站,但效果不错,但只有那个网站不起作用。这是我的密码 class Program { static void Main(string[] args) { Test test = new Test(); test.testDriver(); Console.WriteLine(Enviro
class Program
{
static void Main(string[] args)
{
Test test = new Test();
test.testDriver();
Console.WriteLine(Environment.NewLine + "Done!");
Console.ReadLine();
}
}
public class Test
{
public void testDriver()
{
IWebDriver driver = new FirefoxDriver();
driver.Navigate().GoToUrl(@"http://atrium.xsis.co.id/#!/");
IWebElement login = driver.FindElement(By.Name("email")); //Unable to locate element
//IWebElement login = driver.FindElement(By.Id("email")); //Unable to locate element
//IWebElement login = driver.FindElement(By.Name("password")); //Unable to locate element
//IWebElement login = driver.FindElement(By.Id("password")); //Unable to locate element
//IWebElement login = driver.FindElement(By.XPath("//input[@id='password']")); //Unable to locate element
//IWebElement login = driver.FindElement(By.XPath("//input[@id='email']")); //Unable to locate element
//IWebElement login = driver.FindElement(By.XPath("//input[@name='password']")); //Unable to locate element
//IWebElement login = driver.FindElement(By.XPath("//input[@name='email']")); //Unable to locate element
login.SendKeys("MyName");
login.Submit();
//------------------------------Some sites, i have tried
/* --It Worked
driver.Navigate().GoToUrl(@"https://accounts.google.com/");
IWebElement login = driver.FindElement(By.Name("identifier"));
login.SendKeys("MyName");
login.Submit();
*/
/* --It Worked
driver.Navigate().GoToUrl(@"https://web.facebook.com/");
IWebElement login = driver.FindElement(By.Name("email"));
login.SendKeys("MyName");
login.Submit();
*/
/* --It Worked
driver.Navigate().GoToUrl(@"https://stackoverflow.com/");
IWebElement login = driver.FindElement(By.Name("display-name"));
login.SendKeys("MyName");
login.Submit();
*/
/* --It Worked
driver.Navigate().GoToUrl(@"https://github.com/login?");
IWebElement login = driver.FindElement(By.Name("login"));
login.SendKeys("MyName");
login.Submit();
*/
}
}
我认为这是一个简单的代码,只需定位特定的元素。如果web使用IFrame,但没有框架,则使用其他方法。
我正在使用vs 2013社区版、WebDriver.dll版本3.4.0.0、运行时版本v4.0.30319和Firefox 54.0.1(32位)。您尝试过使用Xpath吗?
driver.findElement(By.xpath(//input[@name='email'])
我发现有时候Selenium很挑剔,您需要尝试其他方法来查找元素。您的代码看起来不错。。。像您的第一次尝试那样简单的操作,
By.Id(“email”)
,应该已经奏效了。当不需要时,您希望首先查看所需元素是否位于IFRAME
中。在这种情况下,情况并非如此
接下来应该尝试的是显式等待,WebDriverWait
IWebElement email = new WebDriverWait(Driver, TimeSpan.FromSeconds(3)).Until(ExpectedConditions.ElementIsVisible(By.Id("email")));
email.SendKeys("MyName");
email.Submit();
wait.Until()
返回等待的元素,因此您可以通过将返回赋值给一个变量然后使用它来捕获它,就像我在上面所做的那样。在Selenium中,有时有一种东西很酷也很烦人,它确实会像用户使用浏览器一样工作。因此,你必须确保你的屏幕上暴露的元素和用户可以点击它,否则你必须crool直到它
另一件重要的事情是引导,它有时会改变其元素的可见性并替换为其他元素
- Scrool指向页面底部的元素
- 确保元素确实可见
- 检查元素上是否有东西
driver.SwitchTo().DefaultContent();
最后,我要尝试的最后一件事是添加一些显式等待,以防在您尝试访问某个元素后加载该元素。不幸的是,这种情况比我想象的要多
这将是我最后一次,厨房水槽,方法
Thread.Sleep(2000);
driver.SwitchTo().DefaultContent();
Thread.Sleep(2000);
By emailLocator = By.CSSSelector("insert CSS Selector Here");
IWebElement email = driver.FindElement(emailLocator);
email.SendKeys("email address");
如果这仍然不起作用,请发布您试图访问的页面的html,我们将看看是否能找出它找不到元素的原因。谢谢您的评论。我刚刚试过,但仍然给了我同样的错误消息“找不到元素”。IWebElement用户名=driver.FindElement(By.XPath(//input[@name='email']);请阅读,特别是关于(MCVE)的部分,这将帮助您调试自己的程序并自行解决问题。如果您这样做了,但仍然卡住了,您可以回来发布您的MCVE,您尝试了什么,以及执行结果,包括任何错误消息,以便我们可以更好地帮助您。同时提供该页面和/或相关HTML的链接。好的,先生,我编辑了。如果我错了,请阅读并纠正我的错误@Jefft,这样更好。谢谢你的编辑,列出了很多不同的尝试。先生,我想再问一次。为什么当我实例化新的FirefoxDriver时,它总是打开新窗口?如何使用现有的浏览器窗口@JeffCWhen我只是键入IWebDriver driver=newFirefoxDriver();它会自动打开新窗口当我打开facebook时,facebook检测到它是新浏览器,需要电话验证这些都是新问题,应该在不同的问题中提问。话虽如此。。。这些问题以前曾被问过。实例化驱动程序始终会启动新浏览器。不能将进程附加到现有浏览器。