Safari Selenium-Actions类&JavaScriptExecutor无法正常工作 [英] Safari Selenium - Actions class & JavaScriptExecutor not working

查看:77
本文介绍了Safari Selenium-Actions类&JavaScriptExecutor无法正常工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在尝试将当前的自动化扩展到Safari浏览器上运行,并且面临多个问题.它们可以在Chrome,Firefox和最近的IE上完美运行,但是在Safari上却遇到问题.关于这些的任何帮助或建议,我们将不胜感激!

We are trying to extend our current automation to run on Safari browser, and facing multiple issues. These work perfectly on Chrome, Firefox and recently with IE too, but facing issues on Safari. Any help or suggestions on these much appreciated !

Actions类在Safari中似乎不起作用.我们将action类用于dragAndDrop.当我们尝试dragAndDrop的动作类时,会抛出错误"org.openqa.selenium.ElementNotInteractableException:" 同样,当我们尝试将动作类用于moveToElement时,它也不起作用.动作类是否有替代方法

Actions class don't seem to work in safari We use actions class for dragAndDrop. When we try actions class for dragAndDrop, an error is thrown "org.openqa.selenium.ElementNotInteractableException:" Also when we try to use actions class for moveToElement, it is not working. Is there an alternative available for actions class

替代方法尝试:尝试使用此网站上的dragAndDrop,但也不起作用: https://ynot408.wordpress.com/2011/09/22/drag-and-drop-using-selenium-webdriver/

Alternative tried : Tried to use dragAndDrop from this site, and it doesn't work either : https://ynot408.wordpress.com/2011/09/22/drag-and-drop-using-selenium-webdriver/

JavaScriptExecutor在Safari上不起作用.当我们尝试使用JavascriptExecutor时,它会抛出相同的错误" org.openqa.selenium.ElementNotInteractableException:"是否需要启用任何功能才能使其正常工作?我确实启用了: safariOptions.setCapability(CapabilityType.SUPPORTS_JAVASCRIPT,"true"); 如果我尝试设置以下功能,则浏览器甚至无法启动:

JavaScriptExecutor don't work on Safari. When we try JavascriptExecutor, it throws the same error "org.openqa.selenium.ElementNotInteractableException:" Is there any capability that needs to be enabled for this to work ? I did enable : safariOptions.setCapability(CapabilityType.SUPPORTS_JAVASCRIPT, "true"); If I try to set the below capability, the browser does not even launch :

safariOptions.setUseCleanSession(true);
safariOptions.setUseTechnologyPreview(true);

请告知您是否有人遇到这些问题,以及是否有其他选择,

Please advice if any of you faced any issue with these, and if you have any alternative for these,

推荐答案

我正在测试kendo应用程序,并在 Selena的答案中尝试了该解决方案,但这是另一种解决方案,最终对我有用,包括Safari 14.

I was testing a kendo application and tried the solutions in Selena's answer but it was a different solution that ended up working for me, including Safari 14.

测试应用程序.

工作中的拖放(使用WebElement而不是CSS字符串):

Working drap and drop (small change to use WebElements rather than CSS strings):

var triggerDragAndDrop = function (elemDrag, elemDrop) {
  /* function for triggering mouse events */
  var fireMouseEvent = function (type, elem, centerX, centerY) {
    var evt = document.createEvent('MouseEvents');
    evt.initMouseEvent(
      type,
      true,
      true,
      window,
      1,
      1,
      1,
      centerX,
      centerY,
      false,
      false,
      false,
      false,
      0,
      elem
    );
    elem.dispatchEvent(evt);
  };

  /* calculate positions*/
  var pos = elemDrag.getBoundingClientRect();
  var center1X = Math.floor((pos.left + pos.right) / 2);
  var center1Y = Math.floor((pos.top + pos.bottom) / 2);
  pos = elemDrop.getBoundingClientRect();
  var center2X = Math.floor((pos.left + pos.right) / 2);
  var center2Y = Math.floor((pos.top + pos.bottom) / 2);

  /* mouse over dragged element and mousedown*/
  fireMouseEvent('mousemove', elemDrag, center1X, center1Y);
  fireMouseEvent('mouseenter', elemDrag, center1X, center1Y);
  fireMouseEvent('mouseover', elemDrag, center1X, center1Y);
  fireMouseEvent('mousedown', elemDrag, center1X, center1Y);

  /* start dragging process over to drop target*/
  fireMouseEvent('dragstart', elemDrag, center1X, center1Y);
  fireMouseEvent('drag', elemDrag, center1X, center1Y);
  fireMouseEvent('mousemove', elemDrag, center1X, center1Y);
  fireMouseEvent('drag', elemDrag, center2X, center2Y);
  fireMouseEvent('mousemove', elemDrop, center2X, center2Y);

  /* trigger dragging process on top of drop target*/
  fireMouseEvent('mouseenter', elemDrop, center2X, center2Y);
  fireMouseEvent('dragenter', elemDrop, center2X, center2Y);
  fireMouseEvent('mouseover', elemDrop, center2X, center2Y);
  fireMouseEvent('dragover', elemDrop, center2X, center2Y);

  /* release dragged element on top of drop target*/
  fireMouseEvent('drop', elemDrop, center2X, center2Y);
  fireMouseEvent('dragend', elemDrag, center2X, center2Y);
  fireMouseEvent('mouseup', elemDrag, center2X, center2Y);

  return true;
};

按照上面Selena的解答中的解决方案注入javascript(将文件读入变量 java_script ).针对现有WebElement(拖动 drop )执行以下操作:

Injected javascript as per solutions in Selena's answers above (read file into variable java_script). Executed against existing WebElements (drag and drop) with:

    String js =  "var src = arguments[0];var dest = arguments[1];";
    js += "triggerDragAndDrop(src, dest);";
    JavascriptExecutor executor = (JavascriptExecutor) webdriver;
    executor.executeScript(java_script + js, drag, drop);

这篇关于Safari Selenium-Actions类&JavaScriptExecutor无法正常工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆