C#Selenium无法定位到任何元素

时间:2017-07-22 14:25:23

标签: c# selenium selenium-webdriver

为什么C#+ Selenium无法定位到此网址中的任何元素

  

我想尝试使用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();
        */
    }
}

我认为这是简单的代码,只需找到特定的元素。或者如果网页使用IFrame,则使用其他方法,但没有框架。 我正在使用vs 2013社区版,WebDriver.dll版本3.4.0.0,RunTime版本v4.0.30319。和Firefox 54.0.1(32位)。

4 个答案:

答案 0 :(得分:0)

你的代码看起来不错......像你第一次尝试一样简单,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()返回等待的元素,因此您可以通过将返回值分配给变量然后使用它来捕获它,就像我上面所做的那样。

答案 1 :(得分:0)

在Selenium的某些时候,有些东西很酷,很烦人,它确实会像使用浏览器的用户一样工作。因此,您必须确保屏幕上显示的元素和用户可以单击它,否则您必须直到它为止。

另一个重要的事情是引导程序,它有时会改变其元素的可见性并替换为其他元素。

  • Scrool到页面底部的元素。
  • 保证元素在字面上可见。
  • 检查元素上是否有东西。

答案 2 :(得分:0)

我还不能发表评论,我更希望这是一个评论,但无论如何都要进行。

我尝试浏览您引用的网站,但无法到达那里。不确定它是否存在或仅被我公司的防火墙阻止。我真的很想看看网站的代码,因为我之前看过这样的问题。通常,当我看到它时,它是一个定位器问题或iframe问题。如果您可以从网站发布有助于诊断问题的html。哦,你写的代码看起来是正确的,但是如果Selenium在错误的框架中查找,这没有任何帮助。

所以,这就是我想要的。

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

其次,我尝试通过CSSSelector进行定位。我知道它应该由Id或XPath工作,但有时它不工作,我不知道为什么。但是,当其他人失败时,我很幸运能够通过CSSSelector进行定位。您可以直接从FireFox开发人员版本的检查窗口中复制CSS Selector。

第三,如果这些都不起作用,我会将SwitchTo传递给默认内容框架,以防万一整个页面位于一个隐藏在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,我们会看看我们是否可以找出它未能找到该元素的原因。

答案 3 :(得分:-1)

您是否尝试过使用Xpath? driver.findElement(By.xpath("//input[@name='email']"))

我发现有时Selenium很挑剔,你需要尝试其他方法来寻找元素。