Selenium - 返回被单击元素的 Xpath

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)

就在这里!

感谢帮助