C#硒罐';不能定位到任何元素

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

为什么C#+Selenium无法仅从该URL定位到任何元素

我想尝试使用c#+selenium以编程方式将数据填充到文本框中。 我曾尝试过一些网站,但效果不错,但只有那个网站不起作用。这是我的密码

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指向页面底部的元素
  • 确保元素确实可见
  • 检查元素上是否有东西

我还不能发表评论,我更希望这是一个评论,但不管怎样,还是这样

我试着浏览你参考的网站,但没能找到。不确定它是否是实时的,或者只是被我公司的防火墙屏蔽了。我真的很想看看网站的代码,因为我以前见过类似的问题。通常,当我看到这一点时,要么是定位问题,要么是iframe问题。如果你能从网站上发布html,这将有助于诊断你的问题。哦,您所编写的代码看起来是正确的,但是如果Selenium在错误的框架中查找,这也没有帮助

所以,下面是我要尝试的

首先,我将使用FireFox的开发者版本并检查元素。确保它不是在你没有注意到的框架内

其次,我会尝试通过CSSSelector定位。我知道它应该通过Id或XPath工作,但有时不行,我不知道为什么。然而,我有幸在其他人失败时通过CSSSelector进行定位。您可以直接将CSS选择器复制到FireFox开发者版本的检查窗口之外

第三,如果这些都不起作用,我会传递一个切换到默认内容框架的开关,以防整个页面都在一个框架中,而这个框架被隐藏在您丢失的div中。其代码为:

 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检测到它是新浏览器,需要电话验证这些都是新问题,应该在不同的问题中提问。话虽如此。。。这些问题以前曾被问过。实例化驱动程序始终会启动新浏览器。不能将进程附加到现有浏览器。