【问题标题】:Can I use JavascriptExecutor with Appium?我可以将 JavascriptExecutor 与 Appium 一起使用吗?
【发布时间】:2019-11-07 08:32:41
【问题描述】:

我正在尝试使用JavascriptExecutor点击一些移动元素(Appium)。
它抛出org.openqa.selenium.WebDriverException:
(见下文)
我的代码很简单。
JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("arguments[0].click();", element);
上面的element 就可以了。
所以我的问题是:
我可以使用JavascriptExecutorAppium 移动元素吗?如果可以,我应该使用JavascriptExecutor 进行哪些更改?

unknown error (An unknown server-side error occurred. status='false'. Failed to complete internal method: 'hybridRunJavascript args: [, 0, result = null;resultType = null;resultMessage = null;function getPathToWithSuffix(element,suffix) {if (element.tagName.toUpperCase() == "HTML".toUpperCase())return '//html'+suffix;if (element===document.body)return '//html/body[1]'+suffix;var ix= 0;var siblings= element.parentNode.childNodes;for (var i= 0; i<siblings.length; i++) {var sibling= siblings[i];if (sibling===element)return getPathToWithSuffix(element.parentNode,'/'+element.tagName.toLowerCase()+'['+(ix+1)+']'+suffix);if (sibling.nodeType===1 && sibling.tagName===element.tagName)ix++;}}function runScriptResultWrapper(element){if((typeof element === undefined) || element == null){result = null;resultMessage = null;return;}else if (typeof element === 'string' || element instanceof String){result = element;resultType = "string";resultMessage = null;return;}else if (typeof element === 'number' || element instanceof Number){if(element % 1 === 0){resultType = "int"}else{resultType = "float";}result = element;resultMessage = null;return;}else if (typeof element === 'boolean' || element instanceof Boolean){resultType = "boolean";result = element;resultMessage = null;return;}var paths = [];if(element.constructor === Array || element.length > 0){var elements = element;for (i = 0; i < elements.length; i++) {var elementPath = getPathToWithSuffix(elements[i],"");paths[i] = elementPath;}resultMessage = null;}else if(!element.parentNode){resultType = "object";result = element;resultMessage = null;return;}else{resultMessage = null;paths[0] = getPathToWithSuffix(element,"");}resultType = null;result = {value: paths};};var userFunc = function() {var arguments = new Array();arguments[0]=document.evaluate("(//*[@resource-id='text' or @id='text'])[1]", document, null, XPathResult.ANY_TYPE, null).iterateNext();;arguments[0].click();;};result = null;var temp_result = userFunc();if(result == null) {result = temp_result;} runScriptResultWrapper(result);]', details: Failed to run javascript '': null) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 0 milliseconds

【问题讨论】:

  • 如果您在 web 上下文中,您尝试的命令可以使用 appium 使用,此命令不会在本机上下文中执行
  • 所以实际上 Appium 不支持 JavascriptExecutor。好的,谢谢。
  • 支持,但取决于你想运行哪个命令.. :)
  • 例如点击等基本命令。但我的意思是在本地环境下工作,而不是网络
  • 那你不能,因为 JavaScript 只在 web 上执行而不是原生

标签: javascript java selenium appium


【解决方案1】:

Appium 中,您只能使用executeScript() method 运行Mobile Commands

喜欢:

Map<String, Object> params = new HashMap<>();
params.put("direction", "down");
params.put("element", ((RemoteWebElement) element).getId());
driver.executeScript("mobile: swipe", params);

所以我的期望是您应该改用element.click() method

如果您在“正常”点击时遇到问题 - 您可以考虑使用SeeTest - Appium Extension Click command,它可以执行多次点击并使用OCR 定位元素

【讨论】:

  • 我对常规的element.click() 方法确实有问题,否则我不会尝试使用JavascriptExecutor,也不会问这个问题。我将学习上面的SeeTest,看看它是否可以解决我的问题。谢谢!
  • 很可能你有错误的定位器或类似的东西,“click()”方法应该可以正常工作,你有任何客户端/服务器日志吗?如果是 - 将它们添加到您的问题中
  • 不,定位器没问题,问题是该元素似乎不可点击,因此使用常规element.click() 点击它可以工作,但效果不佳。耗时较长且不稳定(有时会在元素收到点击之前发生超时)
  • @DmitriT 我不知道 Javascript 只能用于移动命令,我学到了一些新东西。这仍然适用于移动网络应用程序吗?
  • @BillHileman 如果它解决了问题,我会欣然接受答案。
猜你喜欢
  • 2023-03-25
  • 2020-08-04
  • 2018-10-23
  • 2011-02-22
  • 2021-03-16
  • 2016-11-20
  • 2019-01-25
  • 2011-06-11
  • 2017-02-20
相关资源
最近更新 更多