browser.keys() 不适用于 Firefox 53.0 和 webdriver.io

Posted

技术标签:

【中文标题】browser.keys() 不适用于 Firefox 53.0 和 webdriver.io【英文标题】:browser.keys() is not working on Firefox 53.0 & webdriver.io 【发布时间】:2017-11-04 11:05:42 【问题描述】:

在 Firefox 上,browser.keys 抛出错误。

操作系统:MacOs 火狐版本:53.0.3 壁虎司机:0.16.1 Webdriver.io:4.8

请帮助我如何处理此错误。

这里是日志

[17:11:35] 命令发布“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/url” [17:11:41] 命令发布“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/refresh” [17:11:45] 命令获取“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/window/current/size” [17:11:46] 命令发布“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/elements” [17:11:46] 命令获取“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/0/displayed” [17:11:46] 命令获取“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/1/displayed” [17:11:46] 命令发布“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/elements” [17:11:46] 命令获取“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/0/displayed” [17:11:46] 命令获取“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/1/displayed” [17:11:46] 命令发布“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/elements” [17:11:47] 命令发布“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/element/0/value” 警告:“keys”命令将很快被弃用。请使用不同的命令以避免更新 WebdriverIO 后测试失败。 [17:11:47] 命令发布“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/keys” [17:11:47] 命令获取“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/screenshot” [17:11:48] 保存的屏幕截图:ERROR_firefox_2017-06-03T00-11-47.734Z.png [17:11:48] 命令删除“/wd/hub/session/97804a03-d52a-4232-9e3c-41e1fac6a9c5/cookie” 错误:sendKeysToActiveElement 构建信息:版本:'3.4.0',修订:'未知',时间:'未知' 系统信息:主机:'xxx.local',ip:'10.142.4.252',os.name:'Mac OS X',os.arch:'x86_64',os.version:'10.12.5'​​,java.version :'1.8.0_131' 驱动程序信息:driver.version:RemoteWebDriver 错误:找不到请求的资源,或者使用映射资源不支持的 HTTP 方法接收到请求。 在 Object.wait (/Users/xxxx/c3web/xxxx/node_modules/fibers/future.js:449:15) 在 Object.keys (/Users/xxxxx/node_modules/wdio-sync/build/index.js:264:31) 在 Object.exports.customCommands.selector (/Users/xxx/c3web/xxxx/testlib/browser/customCommands.js:158:17) 在 /Users/xxxx/node_modules/wdio-sync/build/index.js:191:29 - - - - - 在键(“Enter”) - index.js:244:37 在 elementIdValue("0", "xxxyyyzzz") - index.js:293:3

【问题讨论】:

【参考方案1】:

正如@iamdanchiv 在他的回答中提到的那样,browser.keys() 将被弃用,但有一种解决方法(我应该为此提交 PR)。

browser.keys() 在后台所做的是调用 /session/:sessionId/keys WebDriver JsonWire 协议中的端点。但是,如果您查看 W3C Webdriver 规范中的 list of endpoints,则此端点不在列表中。我相信它以前是列表的一部分,但已被删除。相反,为了发送密钥,规范声明使用 /session/:sessionId/element/:elementId/value 端点,您可以使用 webdriverio 的 browser.elementIdValue(ID, value) 方法来调用。

现在,如果您阅读了 Selenium's documentation on the JsonWireProtocol 中提到的 /session/:sessionId/keys 的规范,那么使用其他 WebDriver 功能复制实现非常容易。 /session/:sessionId/keys 端点只是这样做:

向活动元素发送序列击键。

有一个端点我们可以调用来抓取当前活动元素,即/session/:sessionId/element/active,它映射到webdriverio的 browser.elementActive() 方法。

在这种情况下,我们需要做的就是重新实现这个browser.keys(),首先找出活动元素是什么,然后将键发送到该元素。

因此,如果您想发送browser.keys("hello world")

var result = browser.elementActive();
var activeElement = result.value && (result.value.ELEMENT || result.value["element-6066-11e4-a52e-4f735466cecf"]);
// Newer versions of the webdriver like Gecko/IEDriver return the element as "element-6066-11e4-a52e-4f735466cecf" (which is documented in the W3C specs) instead of "ELEMENT".
if(activeElement) 
     browser.elementIdValue(activeElement, "hello world");

请注意,这并不完全复制 /session/:sessionId/keys 的行为,根据 Selenium 的文档也是这样做的:

除了隐式终止之外,该命令在各个方面都类似于发送键命令:在调用结束时不释放修饰符。相反,修饰键的状态在调用之间保持不变,因此可以在按下修饰键时执行鼠标交互。

上述解决方案确实在按键序列的末尾隐式释放修饰键,例如“SHIFT”、“CTRL”。所以如果你想按住一个键并进行鼠标交互,那么运气不好的哥们,也许我们必须等待浏览器实现 Webdriver Actions API。但是如果你只想发送“CTRL”+“C”,你可以发送一个这样的键数组:

var result = browser.elementActive();
var activeElement = result.value && result.value.ELEMENT;
if(activeElement) 
     browser.elementIdValue(activeElement, ["CTRL", "c"]);

【讨论】:

对我来说,没有 ELEMENT 属性,但 value 属性上有一个对象,其键为 element + 一些随机字符串,其值为一些随机字符串。所以这对我有用:let result = browser.elementActive(); let activeElement = (result.value as any)[Object.keys(result.value)[0]]; if (activeElement) browser.elementIdValue(activeElement, key); 感谢您的回答! 是的,WC3 更改了返回ELEMENT 的规范,现在使用的密钥是element-6066-11e4-a52e-4f735466cecf,这是较新版本的FF 的GeckoDriver 以及据我所知IEDriver 现在使用的。第 2 行的解决方法是 var activeElement = result.value && (result.value.ELEMENT || result.value["element-6066-11e4-a52e-4f735466cecf"]) 那么解决方案是什么? browser.elementIdValue(activeElement, ["CTRL", "c"]); ? 好吧,很遗憾,elementIdValue 已不在 WDIO5 中【参考方案2】:

嗯,这个错误几乎解释了keys 命令的实现存在问题:WARNING: the "keys" command will be depcrecated soon. Please use a different command in order to avoid failures in your test after updating WebdriverIO.

它目前也只在我的测试用例中使用chromedriver,但我也无法使用它链接命令。 (模拟Ctrl+CCtrl+V)。

查看我对 this 问题的回答。您必须找到另一种方法来解决这个问题,或者等待驱动程序(chromedrivergeckodriver 等)实现新的 Selenium actions 方法。

我在那里给出的答案几乎涵盖了整个问题。或者,您可以尝试 codepoint 方法:browser.keys("\uE007")

希望对你有帮助!

【讨论】:

【参考方案3】:

尝试使用 webdriverio 版本 > v4.9.3,看起来他们修复了它: https://github.com/webdriverio/webdriverio/commit/1f1db4583f62c60c7907f14c080603376e7ec52b

【讨论】:

以上是关于browser.keys() 不适用于 Firefox 53.0 和 webdriver.io的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow - 多 GPU 不适用于模型(输入),也不适用于计算梯度

为啥 UITableViewAutomaticDimension 不适用于 sectionFooterHeight?

为啥排序不适用于矢量?

验证不适用于 saveMany

UipanGesture 不适用于 Uiswitch

jQuery 不适用于 Express