【问题标题】:Safari Selenium - Actions class & JavaScriptExecutor not workingSafari Selenium - Actions 类和 JavaScriptExecutor 不工作
【发布时间】:2021-01-10 02:10:21
【问题描述】:

我们正在尝试扩展我们当前的自动化以在 Safari 浏览器上运行,并面临多个问题。这些在 Chrome、Firefox 和最近也可以在 IE 上完美运行,但在 Safari 上遇到问题。任何关于这些的帮助或建议都非常感谢!

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

尝试过的替代方法:尝试使用此站点的 dragAndDrop,但它也不起作用: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"); 如果我尝试设置以下功能,浏览器甚至不会启动:

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

如果你们中的任何人在这些方面遇到任何问题,请提出建议,如果您有任何替代方案,

【问题讨论】:

  • 您使用的是什么 Safari 和 Selenium 版本?我想我在 Safari 14.0.2 和 Selenium 3.141.59 上遇到了同样的问题。

标签: selenium automation safari


【解决方案1】:

我正在测试一个剑道应用程序并尝试了 Selena's answer 中的解决方案,但它是一个不同的解决方案,最终对我有用,包括 Safari 14。

Test application.

Working drap and drop(使用 WebElements 而不是 CSS 字符串的小改动):

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)。针对现有的 WebElements(dragdrop)执行:

    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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2019-05-02
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多