makliu 发表于 2024-6-19 13:58:32

DrissionPage求助, 有没有大神用过

用 DrissionPage 来控制浏览器;

明明在输入框中已经输入了内容,但是页面上 还是会提示 输入框为空的, 有什么办法可以解决??
【 如果此时在输入框中 手动输入一下空格 , 这个提示就会消失了。】

这里还有一个button 按钮;默认是disabled,    应该是有 js来判断 当输入框中有内容时,   才会去掉 disabled

FishC 发表于 2024-6-19 13:59:46

你好呀!看起来你的问题是关于网页表单输入框的自动化操作。你已经用 DrissionPage 将内容输入到输入框,但页面依旧提示输入框为空,同时按钮也没有激活。这通常是因为某些网站使用 JavaScript 动态验证输入框的内容。

### 解决思路
1. **触发输入事件**:有些网站不仅仅检测输入框的值,还会监听输入事件。所以我们需要在输入内容以后,手动触发一下输入事件。
2. **模拟键盘按键**:如你所说,手动输入一个空格可以解决问题,我们可以模拟这个过程来触发验证。

### 示例代码
以下是一个使用 DrissionPage 的简单示例,展示如何实现上述解决方案:

from drission import DrissionPage

# 初始化 DrissionPage,使用 Chrome 浏览器
page = DrissionPage()

# 打开目标网页
page.get('<网址>')

# 定位输入框元素,并输入内容
input_element = page.ele('<输入框的选择器>')
input_element.input('这里是输入的内容')

# 手动触发输入事件,让 JavaScript 感知到改变
page.run_js("""
var event = new Event('input', { bubbles: true });
document.querySelector('<输入框的选择器>').dispatchEvent(event);
""")

# 模拟输入一个空格
input_element.send_keys(' ')

# 提交表单或点击按钮
submit_button = page.ele('<按钮的选择器>')
submit_button.click()

### 注意事项
1. 请替换 `<网址>`、`<输入框的选择器>` 和 `<按钮的选择器>` 为实际的网页地址和选择器,如 `document.querySelector('#myInput')`。
2. 如果上述方法不能解决问题,可以尝试延迟等待几秒钟,确保页面完全加载,并且 JavaScript 已经绑定好事件监听器。

### 小贴士
有些页面可能有复杂的 JavaScript 验证机制,如果仍然不行,建议多检查下 JavaScript 执行的结果,或者使用 WebDriver 的 `execute_script` 方法进一步调试。

希望这些方法能够帮到你,让页面好好听话!如果还有其他问题,欢迎继续提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

makliu 发表于 2024-6-19 14:15:47

main_ele = page.ele('.login-card-wrapper content company-mode')
login_eles = main_ele.eles('.ivu-col ivu-col-span-24')
company_ele = login_eles.ele('.ivu-input ivu-input-default')
user_ele = login_eles.ele('.ivu-input ivu-input-default')
pwd_ele = login_eles.ele('.ivu-input ivu-input-default')
company_ele.input(company)
# 在company_ele上触发键盘输入事件
page.run_js("""
    var event = new Event('input', { bubbles: true });
    document.querySelector('.ivu-input ivu-input-default').dispatchEvent(event);
""")


这里 会报错,DrissionPage.errors.JavaScriptError:   'description': "TypeError: Cannot read properties of null (reading 'dispatchEvent')

send_keys(' ')也会报错    TypeError: 'NoneType' object is not callable

FishC 发表于 2024-6-19 14:16:02

makliu 发表于 2024-06-19 14:15
main_ele = page.ele('.login-card-wrapper content c ...

听上去你遇到的问题跟JavaScript选择器找不到元素有关。导致这个错误的原因可能有以下几点:

1. 选择器 `.ivu-input ivu-input-default` 找到多个元素,你需要更精确地定位。
2. JavaScript 在执行时,元素未加载完全。
3. 使用的选择器不匹配。

### 定位与调试
首先,我们要确保选择器是正确的,然后再触发事件。为了更好地找到特定的元素,我们可以通过唯一ID或者更具体的CSS选择器来实现。

以下是你的代码的修正和优化版本:

from drission import DrissionPage

# 初始化 DrissionPage,使用 Chrome 浏览器
page = DrissionPage()

# 打开目标网页
page.get('https://example.com')# 请替换为实际网址

# 定位主元素并找到相关的输入框
main_ele = page.ele('.login-card-wrapper .content .company-mode')
login_eles = main_ele.eles('.ivu-input.ivu-input-default')

# 假设按顺序 company, user, pwd 分别是第一个、第二个、第三个
company_ele = login_eles
user_ele = login_eles
pwd_ele = login_eles

# 输入公司名到 company_ele
company = "FishC公司"# 请替换为实际内容
company_ele.input(company)

# 在 company_ele 上触发输入事件
company_ele.run_js("""
    var event = new Event('input', { bubbles: true });
    this.dispatchEvent(event);
""")

# 模拟输入一个空格,这里需要确保元素调取方法正确
company_ele.run_js("""
    this.value += ' ';
    var event = new Event('input', { bubbles: true });
    this.dispatchEvent(event);
""")

### 解释
1. `main_ele = page.ele('.login-card-wrapper .content .company-mode')`: 确保选择器能准确找到元素。
2. `login_eles = main_ele.eles('.ivu-input.ivu-input-default')`: 这里用到更具体的选择器,如果多个class name中间应该点号而不是空格。
3. 通过索引获取 `company_ele`, `user_ele`, 和 `pwd_ele`。
4. 在输入完内容后,直接在元素上触发 `input` 事件和模拟的空格添加。

### 可能的问题和解决方案
1. **元素未加载完成**:可以加入一些等待时间,确保页面元素完全加载。
2. **选择器不准确**:检查网页源码,确保选择器符合实际元素结构。
3. **JavaScript错误**:可以通过浏览器控制台逐步测试JavaScript,以确保正确性。

希望这次能帮助你解决问题,如果还有其他疑问或需要进一步的帮助,请继续提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: DrissionPage求助, 有没有大神用过