是否可以通过 selenium webdriver 执行 OnClick javascript 函数而无需单击

Posted

技术标签:

【中文标题】是否可以通过 selenium webdriver 执行 OnClick javascript 函数而无需单击【英文标题】:Is it possible to execute the OnClick javascript function via selenium webdriver without the click 【发布时间】:2017-11-29 20:26:10 【问题描述】:

我正在构建一个新的测试用例,但遇到了一个新问题,我不知道如何解决。我需要单击一个既是visiblity: hidden 又是display: none 的元素,或者至少需要一种方法来执行它调用的javascript 函数。在通过时,我已经能够使用IJavascriptExecutor 来更改元素的可见性或显示,但是这个选项对这个测试用例没有好处,因为我正在处理我在运行时使用“Driver.FindElements”定位的元素数组,所以我无法获得确切的选择器来使用我的旧方法来更改显示。

IJavaScriptExecutor js = (IJavaScriptExecutor)Driver;
var script = String.Format("document.querySelector('0').style.display='inline-block';", selector);
js.ExecuteScript(script);

附件是相关元素的 html 和 css 属性的屏幕截图。

我看到它的方式有两个选项,我可以使这个测试不是动态的,并在单个硬编码元素上执行功能(糟糕!),或者我可以弄清楚如何动态地执行此操作。所以我的希望(可能是傻瓜的希望)是我可以以某种方式调用绑定到此按钮的 onClick 事件,而无需实际单击它。

【问题讨论】:

【参考方案1】:

您可以提取onclick 属性并将其作为参数发送。你也不需要使用IJavaScriptExecutorIWebDriver扩展了这个接口,所以你可以调用ExecuteJavaScript方法

IWebElement buttonToClick;
string script = buttonToClick.GetAttribute("onclick");
driver.ExecuteJavaScript<object>(script);

你也可以尝试用 JavaScript 点击它

driver.ExecuteJavaScript<object>("arguments[0].click();", buttonToClick);

【讨论】:

【参考方案2】:

无论可见性如何,都可以通过IJavaScriptExecutorIWebElement 执行JavaScript 点击。

听起来您的问题源于无法识别在运行时单击哪个元素,我会看看XPaths。


同时,下面是一个示例,说明如何使用 XPath 使用 JavaScript 单击具有 onclick 事件属性的所有 &lt;button&gt; 元素:

IReadOnlyCollection<IWebElement> buttons =
    Driver.FindElements(By.XPath(".//button[@onclick]"));
IJavaScriptExecutor js = (IJavaScriptExecutor)Driver;
foreach (IWebElement button in buttons)

    js.ExecuteScript("arguments[0].click();", button);

【讨论】:

以上是关于是否可以通过 selenium webdriver 执行 OnClick javascript 函数而无需单击的主要内容,如果未能解决你的问题,请参考以下文章

如何使用selenium Webdriver验证页面中是否存在重复文本

是否可以通过 selenium webdriver 执行 OnClick javascript 函数而无需单击

是否可以使用 Selenium WebDriver 来自动化桌面应用程序?

你的回答“用selenium webdriver来判断一个网页加载完毕”,如何用加载超时报异常来确定是否加载完毕?

是否不赞成使用Selenium中的WebDriverWait(WebDriver驱动程序,long timeoutInSeconds)?

我们是否需要同时拥有Selenium服务器和Selenium WebDriver?