老师 你好,我尝试去selenium源码去看了关于send_keys的源码设计,发现和老师有不一样的地方
来源:9-6 自动化测试异步开发之编写客户端异步webdriver接口类(上)
zzggsls
2023-05-02
selenium源码部分-remote_connection.py文件
上面selenium的remote_connection.py文件的源码,我看他在写send_keys的源码中body参数中,包含了element_id的参数,但是我看老师在设计在设计的时候,没有把这个参数放入进去,这个是为什么呢?麻烦老师解答一下?非常感谢
老师关于send_keys的body部分
1回答
-
好帮手慕小李
2025-02-20
确实,Selenium的
remote_connection.py文件中,在发送send_keys命令时,body参数包含了element_id。这是为了确保服务器知道要向哪个元素发送键值。在您提供的
async_element.py文件中,send_keys方法的实现如下:Python复制
async def send_keys(self, *keys): json = { 'text': ''.join(keys) } return await self.command('POST', '/value', json=json)这里,
json对象只包含了text字段,没有包含element_id。这可能会导致服务器不知道要向哪个元素发送键值。为了解决这个问题,您可以修改
send_keys方法,使其包含element_id。以下是修改后的代码:Python复制
async def send_keys(self, *keys): json = { 'text': ''.join(keys), 'elementId': self.element # 添加element_id } return await self.command('POST', '/value', json=json)这样,
json对象就包含了element_id,服务器就可以知道要向哪个元素发送键值了。另外,在
remote_connection.py文件中,send_keys命令的实现如下:Python复制
command_info = self._commands[command]assert command_info is not None, 'Unrecognised command %s' % command path = string.Template(command_info[1]).substitute(params)if hasattr(self, 'w3c') and self.w3c and isinstance(params, dict) and 'sessionId' in params: del params['sessionId']data = utils.dump_json(params)url = '%s%s' % (self._url, path)return self._request(command_info[0], url, body=data)
这里,
params字典包含了element_id,path模板会将其替换为实际的元素ID。然后,data对象包含了text字段,服务器就可以知道要向哪个元素发送键值了。00
相似问题