我想点击一个单选按钮,但有时会得到异常“隐形元素”。我使用Thread.Sleep()函数,但没有。它有时不总是发生。我通常可以使用selenium web driver
单击单选按钮wd.FindElement(By.XPath("//input[@value=2]")).Click();
答案 0 :(得分:11)
当想要点击隐藏元素时,使用javascript是一个不错的选择。 Selenium无法对隐藏元素执行操作(即单击)。 javascript函数有两个选项:
第一个实际上会模拟点击
((IJavaScriptExecutor)wd).ExecuteScript("arguments[0].click();", wd.FindElement(By.XPath("//input[@value=2]")));
第二个只会触发点击发生时应该发生的事件。
((IJavaScriptExecutor)wd).ExecuteScript("arguments[0].trigger('click');", wd.FindElement(By.XPath("//input[@value=2]")));
答案 1 :(得分:2)
在检查时它实际上是不可见的吗?即你需要等待它。您可以使用WebDriverWait等待它变为可见。
e.g。
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0,0,5));
wait.Until(w=>w.FindElements(By.XPath("//input[@value=2]")).Any());
答案 2 :(得分:1)
您可以尝试通过javascript将其显示,然后点击后将其恢复为隐藏状态:
IWebElement element = Driver.FindElement(By.XPath("//input[@value=2]"))
((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = false;", element);
element.click
((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = true;", element);
将其包装在扩展方法中,并在需要时使用
public static IWebElement ClickOnInvisibleElement(this IWebDriver Driver, By by)
{
IWebElement element = Driver.FindElement(by))
((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = false;", element);
element.click
((IJavaScriptExecutor)Driver).ExecuteScript("arguments[0].hidden = true;", element);
return element;
}
Driver.ClickOnInvisibleElement(By.XPath("//input[@value=2]"));
答案 3 :(得分:1)
我非常喜欢@JustinHarvey的答案 - 因为通常元素因某种原因而不可见,而且通常只需要让它变得可见。他的剧本对我不起作用,但是当我稍微修改它时就做到了。
WebDriverWait wait = new WebDriverWait(driver, new TimeSpan(0, 0, 5));
wait.Until(w => driver.FindElements(By.CssSelector("[type='submit']")).ToList().Any(o => o.Displayed));
希望这可以节省你一些时间。
答案 4 :(得分:1)
当您按XPath
,Id
或Class
定位元素时,有时需要更多时间才能在上一个操作后加载新的HTML页面。在这种情况下,您只需要放置更多时间在Thread.Sleep(time);
上逃离异常。
您可以使用下面的代码( C#)等待元素显示:
Thread.Sleep(10000);
WebDriverWait wait = new WebDriverWait(WebDriver, TimeSpan.FromSeconds(30));
IWebElement element= wait.Until<IWebElement>((d) =>
{
return d.FindElement(By.Id("elementID"));
});
element.Click();
使用IJavaScriptExecutor
点击元素的另一种方式( C#):
IWebDriver webDriver;
IWebEelement webElement = webDriver.findElement(By.XPath(Element xpath));
IJavaScriptExecutor executor = (IJavaScriptExecutor)webDriver;
executor.ExecuteScript("arguments[0].click();", webElement );
Java 中的代码几乎相同。
我希望它可以帮到你。
答案 5 :(得分:0)
使用java脚本执行器来实现魔力。
((JavascriptExecutor) webdriver).executeScript("document.getElementById('btn')[0].click
阅读本文了解更多详情:http://www.anitpatel.net/2012/02/25/selenium-webdriver-how-to-click-on-a-hidden-link-or-menu/
答案 6 :(得分:0)
似乎您的webdriver在不可见时会尝试单击单选按钮。这取决于页面加载的速度。我建议使用webdriverWait等待单选按钮变为可见。您的代码看起来像这样:
var wait = new WebDriverWait(wd, TimeSpan.FromMinutes(1));
wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//input[@value=2]")));
wd.FindElement(By.XPath("//input[@value=2]")).Click();
第一行初始化等待变量。这样做是因为它使用你允许等待变量来使用你的webdriver等待某些元素,并设置等待时间的时间限制(我将等待时间设置为一分钟)。下一行实际上等待单选按钮出现,等待xpath变为可见。最后,如果按钮可见,则单击该按钮。如果wait.until命令超过分配的等待时间,则抛出异常。
答案 7 :(得分:0)
我认为问题在于您在获得上一步的答案之前会快速进入下一步。
我遇到同样的问题:
第1步:打开一个窗口
第二步:点击窗口按钮
我的问题是JS没有足够快地返回数据所以我试图在窗口出现之前按下按钮(所以我得到了“隐形”错误)
要解决这个问题,请将Thread.sleep(1000)
放在代码中。