如何单击Selenium WebDriver中不可见的元素?

时间:2014-01-15 13:56:26

标签: c# .net selenium selenium-webdriver

我想点击一个单选按钮,但有时会得到异常“隐形元素”。我使用Thread.Sleep()函数,但没有。它有时不总是发生。我通常可以使用selenium web driver

单击单选按钮
wd.FindElement(By.XPath("//input[@value=2]")).Click();

8 个答案:

答案 0 :(得分:11)

当想要点击隐藏元素时,使用javascript是一个不错的选择。 Selenium无法对隐藏元素执行操作(即单击)。 javascript函数有两个选项:

  1. 第一个实际上会模拟点击

    ((IJavaScriptExecutor)wd).ExecuteScript("arguments[0].click();", wd.FindElement(By.XPath("//input[@value=2]")));
    
  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)

当您按XPathIdClass定位元素时,有时需要更多时间才能在上一个操作后加载新的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)放在代码中。