为什么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位)。
答案 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的某些时候,有些东西很酷,很烦人,它确实会像使用浏览器的用户一样工作。因此,您必须确保屏幕上显示的元素和用户可以单击它,否则您必须直到它为止。
另一个重要的事情是引导程序,它有时会改变其元素的可见性并替换为其他元素。
答案 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很挑剔,你需要尝试其他方法来寻找元素。