我正在学习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