问题描述
分析问题
1、开始以为等待时间问题没有找到元素(没解决)
2、使用js操作元素(没解决)
3、定位到光标元素
问题描述
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())