Selenium WebDriver如何点击隐藏元素

11

您好,我想知道如何使用Selenium WebDriver单击隐藏的元素和/或禁用元素。

我知道在Selenium 1中可以像下面这样做:

selenium.click(id="idOfHiddenField");

这种方法在selenium 1中有效,但是在selenium 2(WebDriver)中不起作用。我不想使用jQuery启用或显示隐藏字段,也不想使用JavaScript,因为大多数测试都使用XPath。 那么我只能继续使用旧版本的selenium来单击隐藏字段了吗?


1
WebDriver不允许与隐藏元素进行交互。这是有道理的 - 用户无法单击隐藏字段,因此为什么您的测试应该这样做呢? - JacekM
像JaceM提到的那样,以普通用户的身份浏览网页流程。如果用户需要单击某个元素才能使其可见,请执行该操作。关于这个问题我没有更多可以说的了。 - Greg
我想在测试环境中能够通过隐藏字段的技巧创建假数据...还要测试关闭了JavaScript等情况。 - Chun ping Wang
许多jquery-ui小部件使用包含要提交的实际值的隐藏元素。这些jquery-ui小部件可以更改,从而破坏所有测试,但如果使用基础元素进行测试,则测试将继续工作。我认为CSS注入可能是一种强制显示所有所需隐藏元素的方法。但是,对于每个jquery-ui小部件,具有两个并排可见的元素可能会使测试看起来有点奇怪。 - Brain2000
3个回答

14

使用JavascriptExecutor有一种更简单的方法来解决这个问题。

例如:

document.getElementsByClassName('post-tag')[0].click();

即使" Selenium "标签被隐藏(假设),上面的JavaScript也将单击此页面右上方的" Selenium "标签。

您只需要通过JavascriptExecutor接口发出这个JS指令,就像这样:

(JavascriptExecutor(webdriver)).executeScript("document.getElementsByClassName('post-tag')[0].click();");

这将使用JS沙盒和合成的点击事件来执行点击操作。虽然它违背了WebDriver用户活动模拟的目的,但在像您这样的特定场景中,可以有效地使用它。


谢谢,但我已经使用了类似 //input[@value='xxx'] 的 XPath。 - Chun ping Wang
3
这不是重点。任何定位器都可以定位到任何隐藏的元素,XPath、CSS、ID或其他。我建议您使用JSExecutor来绕过WebDriver的智能化。你试过了吗?对你有用吗?您可以继续使用XPath定位器来定位WebElement,并将其传递到JS脚本中,该脚本将单击传入的元素。 - Ashwin Prabhu

1

有一个答案但有多个建议:

答案:使用Selenium支持的驱动程序,使用类似以下方式单击隐藏元素

Selenium selenium = new WebDriverBackedSelenium(driver, baseUrl);
selenium.clickAt("xpath=//area[@alt='Mercury']", clickPoint);

建议1:如果需要创建大量的虚假数据,并且您正在寻找FOSS,请选择JMeter。
建议2:如果要检查JavaScript是否关闭,请在Firefox实例本身中禁用JavaScript。
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setJavascriptEnabled(false);

JavaScript可以通过这个选项启用::javascriptEnabled => true,对吧? - Aravin

0

也许它不能满足您的需求,但对于其他人来说,另一个解决方案可能是修改 CSS 来隐藏元素。

尽管 Selenium 无法找到 display: none; 元素,但它会找到以下元素:

.hide {
    position: absolute;
    top: -99em;
    left: -99em;
}

那么,你的应用程序中不再使用jQuery.show/hide/toggle,而是使用jQuery.toggleClass('hide', true/false/unset_to_toggle)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接