Mxf*_*rdA 5 javascript java selenium xpath didselectrowatindexpath
我正在用 java 开发 Selenium 测试,并且正在寻找解决我的问题的方法。我想在测试期间单击元素的区域(坐标)。此单击隐式返回该区域中存在的单击元素的 Xpath,以便第二次比较此 Xpath。
为什么我要比较这个 Xpath ?
我想检查这个 Xpath 是否是应该显示在屏幕上的元素之一。例如,当我更改网页的 css 时,按钮可以被 div 或 wathever 隐藏。所以我希望我的测试单击该按钮的区域,获取该区域中存在的元素的 Xpath,并检查它是否是我的按钮的 Xpath!
我已经找到了单击特定坐标的解决方案,但它始终取决于元素。
我也已经使用 Javascript 开发了这个解决方案:
if (driver instanceof JavascriptExecutor) {
((JavascriptExecutor)driver).executeScript("MY SCRIPT");
} else {
throw new IllegalStateException("This driver does not support JavaScript!");
}
Run Code Online (Sandbox Code Playgroud)
我可以将脚本集成到我的 Java Selenium 测试中,但我找不到在 Java 变量中获取返回的 Xpath 值的方法。
谢谢你们的帮助!
============已解决================
我解决了我的问题。对于那些遇到同样问题的人,这是我的解决方案:在 Java 中的 Selenium 测试中,我创建了一个包含 Javascript 的方法:
public void IsHiddenByOtherElement(WebDriver driver, String xpath, int CordX, int CordY) throws IOException
{
if (driver instanceof JavascriptExecutor)
{
String script = "setTimeout(function() "
+ "{jQuery(document.elementFromPoint("+CordX+", "+CordY+")).click();}, 0.1);"
+ "elementClicked = document.elementFromPoint("+CordX+", "+CordY+");"
+ "var value2 = "+xpath+";"
+ "var id = elementClicked.id;$( '#' + id ).click(function() "
+ "{ "
+ "var value=xpath(this); "
+ "if (value!=value2) throw new Error(value + ' : Element cache sous un autre : '+ value2);"
+ "});"
+ "function xpath(el) "
+ "{"
+ "if (typeof el == 'string') return document.evaluate(el, document, null, 0, null);"
+ "if (!el || el.nodeType != 1) return '';"
+ "if (el.id) return '//*[@id=' + el.id + ']';var sames = [].filter.call(el.parentNode.children, "
+ "function (x) { "
+ "return x.tagName == el.tagName });"
+ "return xpath(el.parentNode) + '/' + el.tagName.toLowerCase() + (sames.length > 1 ? '['+([].indexOf.call(sames, el)+1)+']' : '');"
+ "}";
((JavascriptExecutor) driver).executeScript(script);
}
else
{
throw new IllegalStateException("This driver does not support JavaScript!");
}
final List jsErrors = JavaScriptError.readErrors(driver);
assertTrue(jsErrors.toString(), jsErrors.isEmpty());
}
Run Code Online (Sandbox Code Playgroud)
此方法模拟特定坐标中的单击,恢复该元素的 Xpath,并将其与应该显示在屏幕上的元素的 Xpath 进行比较。如果比较不成功,则会生成 JavaScript 错误。此方法还配置为侦听此 JavaScript 错误并在发生错误时停止测试,并将其作为任何经典 Selenium Java 错误返回
String脚本是Javascript对比测试。
还有:
final List jsErrors = JavaScriptError.readErrors(driver);
assertTrue(jsErrors.toString(), jsErrors.isEmpty());
Run Code Online (Sandbox Code Playgroud)
这两行代码用于监听 JavaScript 错误并在发生错误时停止正在运行的测试。
要完成,您只需要
FirefoxProfile ffProfile = new FirefoxProfile();
JavaScriptError.addExtension(ffProfile);
final WebDriver driver = new FirefoxDriver(ffProfile);
driver.get("file:///Users/Max/Downloads/elementfrompoint.html");
IsHidden(driver,"'//*[@id=test]'",50,50);
Run Code Online (Sandbox Code Playgroud)
就在这里!
感谢帮助