Selenium - 返回单击元素的Xpath

时间:2016-03-16 08:25:50

标签: 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!");
          }

我可以在我的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);

就在这里!

感谢您的帮助

0 个答案:

没有答案