对于 W3C WebDriver "Find Element From Element" 命令,如何格式化请求 URL 中的元素 ID?



我正在学习WebDriver的工作原理,但我不明白如何格式化从元素查找元素的请求URL。

Find Element 的元素 ID 将返回如下内容:

{"element-6066-11e4-a52e-4f735466cecf": "e72b0320-5d61-4886-b903-5b2e4bb43d88"}

据我了解,上述{key: value}格式是元素 ID。 如果是这种情况,一个用户如何将其作为"POST/session/{session id}/element/{element id}/element"中的{element id}? 如果{key: value}不是元素 ID,那是什么? 格式正确的请求 URL 会是什么样子?

谢谢!

在上面的示例中,元素 ID 为"e72b0320-5d61-4886-b903-5b2e4bb43d88"。这有点令人困惑,因为不是创建一个看起来像这样的对象:

{"ELEMENT": "e72b0320-5d61-4886-b903-5b2e4bb43d88"}

我们有非常奇怪的:

{"element-6066-11e4-a52e-4f735466cecf": "e72b0320-5d61-4886-b903-5b2e4bb43d88"}

这是怎么回事?从高处看,JSON 对象中指示我们正在处理元素 ID 的键是任意和常量字符串"element-6066-11e4-a52e-4f735466cecf"。原因是任何非任意键最终都可能成为某些不相关的 JavaScript 代码的返回值。考虑一下这个 JavaScript 代码:

return document.getElementById('foo');

这可以用于ExecuteScript,如下所示(例如在 Python 中):

driver.execute_script("return document.getElementById('foo');");

这里应该退回什么?好吧,我们正在处理一个实际的HTML元素,它不能转换为JSON并通过网络发送回Python客户端。因此,WebDriver 会将对该元素的引用存储为 ID,并将其发回。但它不能只是将 ID 作为字符串发送回去,因为driver.execute_script无法提前知道可能会返回哪种内容。也许它不是元素 ID,也许是与您的应用程序相关的其他字符串。过去,JSON WebElement的标准格式是我上面提到的(使用ELEMENT键)。

然而,在某些时候,一定有人编写了一些JavaScript代码,这导致了一个JS对象,其中包含单词ELEMENT作为密钥。这个对象与WebElements无关,但是当它通过调用driver.execute_script返回时,客户端将其转换为WebElement对象!

这种情况是否真的发生过是无关紧要的;关键是像ELEMENT这样一个简单的简短词已经成熟,可以发生名称冲突。规范作者想要一种方法来明确表示我们正在处理WebElement,即使我们以序列化的JSON格式遇到它,并且以一种不太可能与Web开发人员或测试人员正在做的其他事情发生冲突的方式。

因此,对您的问题最直接的答案是,您的 POST 请求应如下所示:

POST /session/{session id}/element/e72b0320-5d61-4886-b903-5b2e4bb43d88/element

最新更新