我是C#Selenium的新手。我试图自动化“登录”和“退出”LinkedIn应用程序。为此,我写了下面的代码,
这里的“退出”是一个隐藏的元素。
我的代码
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.linkedin.com/");
driver.Manage().Window.Maximize();
driver.FindElement(By.Id("login-email")).SendKeys("valid email ID");
driver.FindElement(By.Id("login-password")).SendKeys("valid password");
driver.FindElement(By.Name("submit")).Click();
Actions action = new Actions(driver);
action.MoveToElement(driver.FindElement(By.XPath("//*[@id='img-defer-id-1-6775']"))).Build().Perform(); // Getting an exception here
Thread.Sleep(3000);
driver.FindElement(By.XPath("//*[@id='account-sub-nav']/div/div[2]/ul/li[1]/div/span/span[3]/a")).Click();
但是我得到了“没有这样的元素例外”。即使我试图通过ID找到元素,但得到相同的异常。不确定我做错了什么。
任何人都可以帮助我。
答案 0 :(得分:4)
Hoverable elements我发现使用JavaScript是最好的。 Action Builder往往具有较高的失败率,并且会导致其他可隐藏元素在滚动页面时变得可见,从而导致您想要隐藏的元素变得模糊。我已经在网上找到了这种方法(不记得在哪里),并且它比我尝试过的任何其他方法都要好得多。
String javaScript = "var evObj = document.createEvent('MouseEvents');" +
"evObj.initMouseEvent(\"mouseover\",true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);" +
"arguments[0].dispatchEvent(evObj);";
IJavaScriptExecutor executor = driver as IJavaScriptExecutor;
executor.ExecuteScript(javaScript, webElement);
答案 1 :(得分:2)
单击“提交”按钮后尝试添加Thread.sleep。 这里的问题是selenium驱动程序甚至在页面加载之前都在搜索元素。没有找到Hence元素的异常。
代替代码中的Thread.sleep,您可以使用显式等待。
试试这个
IWebDriver driver = new ChromeDriver();
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(60));
driver.Navigate().GoToUrl("https://www.linkedin.com/");
driver.Manage().Window.Maximize();
driver.FindElement(By.Id("login-email")).SendKeys("valid email ID");
driver.FindElement(By.Id("login-password")).SendKeys("valid password");
driver.FindElement(By.Name("submit")).Click();
Actions action = new Actions(driver);
wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='img-defer-id-1-6775']")));
action.MoveToElement(driver.FindElement(By.XPath("//*[@id='img-defer-id-1-6775']"))).Build().Perform();
wait.Until(ExpectedConditions.ElementIsClickable(By.XPath("//*[@id='account-sub-nav']/div/div[2]/ul/li[1]/div/span/span[3]/a"))).Click();
答案 2 :(得分:-1)
如果您尝试点击的元素不可见,您可以通过JavaScript将其显示,然后点击它:
((IJavaScriptExecutor)Driver).ExecuteScript("THE ELEMENT YOU WANT TO CLICK.hidden = false;", element);
element.click