所以我有一个Selenium测试,它在按钮与按钮交互之前等待按钮加载。
从我的代码中可以看到,我已经实现了它,以便驱动程序将等待14秒(14是一个随机数),或者如果元素位于14秒之前它将继续运行。
但是,即使在我等待元素加载并尝试与之交互(使用Click()方法)之后,我仍然收到此错误,表明该元素不可交互。
有趣的是,它实际上有时可以工作-元素确实是可交互的-但有时却不起作用。
public void TestChromeDriverMinimalWaitTime()
{
driver.Navigate().GoToUrl("http://www.google.com");
//find search bar and enter text
driver.FindElement(By.Name("q")).SendKeys("Selenium");
//wait 14 seconds max..
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(14));
//...unless button element is found
IWebElement waitUntil = wait.Until(x => x.FindElement(By.Name("btnK")));
//once found, click the button
waitUntil.Click();
//wait 4 secs till this test method ends
Thread.Sleep(2000);
}
这是我得到的错误: 第53行是这样的行: waitUntil.Click();
根据@DebanjanB的答案修订的工作代码:
public void TestChromeDriverMinimalWaitTime()
{
driver.Navigate().GoToUrl("http://www.google.com");
//find search bar and enter text
driver.FindElement(By.Name("q")).SendKeys("Selenium");
//wait 14 seconds max..unless button element is found
IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(14)).Until(ExpectedConditions.ElementToBeClickable(By.Name("btnK")));
//click enter
element.SendKeys(Keys.Return);
Thread.Sleep(2000);
}
答案 0 :(得分:1)
有时它可以正常工作,这似乎是时间问题。也许该元素开始是禁用的,并在一些微小的延迟或事件后启用。尝试在.Click之前添加延迟。您还可以检查按钮元素的状态,以查看其是否被禁用。
答案 1 :(得分:0)
您可以尝试使用以下代码检查页面中某个元素的可见性。
public void TestChromeDriverMinimalWaitTime()
{
driver.Navigate().GoToUrl("http://www.google.com");
//find search bar and enter text
driver.FindElement(By.Name("q")).SendKeys("Selenium");
//...unless button element is found
while(!IsElementVisible(driver.FindElement(By.Name("btnK"))){
Thread.Sleep(1000);
}
//once found, click the button
waitUntil.Click();
//wait 4 secs till this test method ends
Thread.Sleep(2000);
}
public bool IsElementVisible(IWebElement element)
{
return element.Displayed && element.Enabled;
}
答案 2 :(得分:0)
从您的代码试用开始,您似乎正在尝试在按钮上调用Google Home Page上的文本为 Google搜索的click()
。
您采用的引发 WebDriverWait 的方法非常完美。但是,如果您分析HTML DOM,则会发现经过调整的locator strategy可以标识DOM Tree中的多个(两个)元素。因此, locator 不能唯一地标识所需的元素。执行期间,定位器会标识不可见的另一个元素。因此,您看到的错误为:
ElementNotVisibleException: element not interactable
这里最简单的方法是将您标识为搜索框:
driver.FindElement(By.Name("q")).SendKeys("Selenium");
位于表单中,一旦发送了搜索文本,您就可以使用以下任一解决方案:
发送Keys.Return
如下:
IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.Name("q")));
element.SendKeys("Selenium");
element.SendKeys(Keys.Return);
发送Keys.Enter
如下:
IWebElement element = new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.Name("q")));
element.SendKeys("Selenium");
element.SendKeys(Keys.Enter);