我正在构建一个新的测试用例并遇到了一个新问题我不知道如何解决。我需要单击同时为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事件而不实际点击它。
答案 0 :(得分:3)
您可以提取onclick
属性并将其作为参数发送。您也不需要使用IJavaScriptExecutor
,IWebDriver
扩展此界面,因此您只需调用ExecuteJavaScript方法
IWebElement buttonToClick;
string script = buttonToClick.GetAttribute("onclick");
driver.ExecuteJavaScript<object>(script);
您也可以尝试点击JavaScript
driver.ExecuteJavaScript<object>("arguments[0].click();", buttonToClick);
答案 1 :(得分:2)
无论可见性如何,都可以通过IWebElement
对IJavaScriptExecutor
执行JavaScript点击。
听起来你的问题源于无法确定在运行时点击哪个元素,我会看看XPaths。
与此同时,以下是使用XPath点击具有<button>
事件属性的所有onclick
元素的JavaScript示例:
IReadOnlyCollection<IWebElement> buttons =
Driver.FindElements(By.XPath(".//button[@onclick]"));
IJavaScriptExecutor js = (IJavaScriptExecutor)Driver;
foreach (IWebElement button in buttons)
{
js.ExecuteScript("arguments[0].click();", button);
}