老师 你好,我尝试去selenium源码去看了关于send_keys的源码设计,发现和老师有不一样的地方

来源:9-6 自动化测试异步开发之编写客户端异步webdriver接口类(上)

zzggsls

2023-05-02

selenium源码部分-remote_connection.py文件
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_idpath模板会将其替换为实际的元素ID。然后,data对象包含了text字段,服务器就可以知道要向哪个元素发送键值了。

0
0

Python自动化测试开发实战,能帮你就业的测试课

开发高扩展、高可用的自动化测试框架,利用好测试自动化技术。

452 学习 · 157 问题

查看课程