selnium操作输入框无法输入内容

本文探讨了使用Selenium处理网页元素时遇到的问题及解决方案。包括等待时间调整、JS操作元素、光标定位及通过Cookie调用接口等方法。

问题描述

分析问题

1、开始以为等待时间问题没有找到元素(没解决)

2、使用js操作元素(没解决)

3、定位到光标元素

4、种cookie直接走接口调用

问题描述

selenium.common.exceptions.ElementNotInteractableException: Message: element not interactable  报错信息说明元素不能操作,也可能是没有找到元素所以我的send_keys操作报错了

分析问题

1、开始以为等待时间问题没有找到元素(没解决)

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

# 使用隐形等待方式获取元素

driver = webdriver.Chrome() 
wait = WebDriverWait(driver, 10000) 
sql_str_element = wait.until(lambda x: x.find_elements(by='xpath', value=sql_str_string))
sql_str_element.send_keys('SELECT * FROM pb_app')

2、使用js操作元素(没解决)

# 获取元素的html
document.getElementsByClassName("view-line")[1].innerHTML
#元素追加内容
document.getElementsByClassName("view-line")[1].append("SELECT * FROM pb_app")
# 获取元素的内容
document.getElementsByClassName("view-line")[1].textContent 

#元素替换内容

document.getElementsByClassName("view-line")[1].textContent.replace("pb_app","app_pb")

# 元素内容清空

document.getElementsByClassName("view-line")[1].textContent=""

# 选择器方式获取元素

document.querySelector('div.view-line').getElementsByTagName('span')[1].setAttribute('value','a');

 代码实现

#第一种:python找到class元素操作(依然报错如斯)
from selenium.webdriver.common.by import By

sql_str_elements = driver.find_elements(by=By.CLASS_NAME, value="view-line")
    # 这里是查询页面有tab几个就是用最后一个,这里是打开了2个,选取第二个(分析元素发现)
print(sql_str_elements[-1].get_attribute('outerHTML'))
sql_str_elements[-1].send_keys("SELECT * FROM pb_app")


#第二种:直接操作js命令(页面有效果输入了内容,但是无法点击执行按钮执行sql)
driver.execute_script('document.getElementsByClassName("view-line")[1].textContent="SELECT * FROM pb_app"')

3、定位到光标元素

分析元素发现特点

# 获取当前活动元素

document.activeElement  

 这次成功了。。。。。。。。。。。。。。

# 先在输入框中点击,让光标在这里闪烁
driver.find_element(by=By.XPATH, value='这个输入框的定位').click()
# switch_to.active_element获取当前活动的元素,并想这个元素发送内容
driver.switch_to.active_element.send_keys("select * from bp_app")

# js方式获取当前活动元素
active_element = driver.execute_script("return document.activeElement")  
# 这里的 return保证js执行结果获取
# TEXTAREA 编辑区域
active_element.send_keys(sql_str)

4、种cookie直接走接口调用

import requests
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.support.ui import WebDriverWait

# 登录
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10000)
driver.get("登录的url")
# 输入用户名
username_element = self.wait.until(lambda x: x.find_element(by="name", value="username"))
username_element.send_keys(Keys.CONTROL, 'a')   # 清理内容
username_element.send_keys("用户名")
# 输入密码
passwor_element = driver.find_element(by="name", value="password")
passwor_element.clear()
passwor_element.send_keys("密码")
# 点击登录按钮
login_button = driver.find_element(by="id", value="loginBtn")
login_button.click()


# cookie组装
# 获取所有的cookie
time.sleep(5) #  保证页面响应有cookie可以获取,也可隐性等待检查一个元素
for tt in driver.get_cookies():
    print(tt)
# 获取指定的cookie
remember_me = driver.get_cookie("rememberMe")
print(remember_me)
cookie_str = "=".join([remember_me["name"], remember_me["value"]])
print(cookie_str)

res = requests.post(
         url="调用的接口url",
         headers={"Content-Type": "application/json;charset=UTF-8",
                  "Cookie": cookie_str,
                  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36"
                  },
         # data是接口入参,这里sqlText才是我们需要根据情况变化的地方
         data=json.dumps({
                "sqlText": "SELECT * from bp_app",
                "dbId": 25901,
                "resultSetIndex": 0,
                "start": 0,
                "limit": 200,
                "isPrimary": False
            }))
print(res.status_code)
print(res.json())

 

Selenium输入框只能点击但无法输入内容时,可参考以下解决办法: - **使用clear()方法**:先定位到输入框,使用`clear()`方法清空输入框内容,再进行输入操作。示例代码如下: ```python from selenium import webdriver browser = webdriver.Firefox() browser.get("https://www.baidu.com/") input_kw = browser.find_element_by_id("kw") input_kw.clear() input_kw.send_keys("selenium") ``` 这种方法能避免输入框内原有内容对新输入内容造成影响,保证输入操作顺利进行 [^4]。 - **执行鼠标事件与Js结合**:若`clear()`方法无法正常清空输入框,可执行鼠标事件的双击,再使用Js将输入框清空。示例代码如下: ```python from selenium import webdriver from selenium.webdriver import ActionChains # 实例化一个浏览器对象 browser = webdriver.Chrome() # 步骤一:定位到输入框的位置 input_box = browser.find_element_by_xpath('xxx') # 步骤二:执行鼠标事件的双击 ActionChains(browser).double_click(input_box).perform() ActionChains(browser).release() # 步骤三:执行Js将输入框清空 # 需要注意,以下的xxx为节点的TagName属性名称 browser.execute_script('document.getElementsByTagName("xxx").value="";') ``` 此方法适用于常规清空方法无效的情况,通过模拟鼠标操作和执行Js代码来解决问题 [^1]。 - **利用uiautomation与粘贴操作**:先定位节点,将内容粘贴到剪切板,再通过`Ctrl + V`组合键将内容粘贴到输入框。示例代码如下: ```python import uiautomation as auto from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys # 实例化chrome浏览器 driver = webdriver.Chrome() def write_to_input_edit(content: str): """ 内容写入到输入框,步骤如下: 先定位节点 将内容粘贴到剪切板 执行键盘事件,Ctrl+V :param content: 需要写入到输入框内容 :return: None """ # 定位到输入框 input_edit_node = driver.find_element(By.XPATH, "//div") # 将需要写入输入框内容粘贴到 剪切板 auto.SetClipboardText(text=content) # selenium执行键盘操作,Ctrl+V,即粘贴 input_edit_node.send_keys(Keys.CONTROL, 'V') ``` 该方法借助系统的剪切板功能,绕过输入框本身可能存在的输入限制 [^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值