我正在用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!");
}
我可以在我的Java Selenium测试中集成脚本,但是我找不到在Java变量中获取返回的Xpath值的方法。
感谢您的帮助!
============已解决================
我解决了我的问题。对于那些有同样问题的人,这是我的解决方案: 在我的Java Selenium Test中,我创建了一个包含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());
}
此方法模拟特定坐标中的单击,恢复该元素的Xpath,并将其与应该在屏幕上显示的元素的Xpath进行比较。如果比较不成功,则会生成JavaScript错误。此方法还配置为侦听此JavaScript错误并在发生测试时停止测试,并将其作为任何经典Selenium Java错误返回
字符串脚本是Javascript比较测试。
还有:
final List jsErrors = JavaScriptError.readErrors(driver);
assertTrue(jsErrors.toString(), jsErrors.isEmpty());
这两行是监听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);
就在这里!
感谢您的帮助