在今天写了一个用selenium模拟qq空间登录,破解滑块验证的时候鼠标拖到了位置,但不释放,我用了click点击代替了,不知道我那个释放鼠标的事件是不是哪里写错了(释放在下图黄框38行)
完整代码:
```python
from selenium.webdriver import Chrome, ActionChains
from selenium.webdriver.common.by import By
from time import sleep
sleep(1)
# 创建一个对象
web = Chrome()
web.maximize_window() # 最大化浏览器窗口
web.get("https://qzone.qq.com/")
web.implicitly_wait(1) # 设置等待时间,防止因为页面没加载出来而获取不到网页元素
web.switch_to.frame("login_frame") # 加载嵌入在页面中的iframe定位元素
# 获取元素
web.find_element(By.CSS_SELECTOR, '#switcher_plogin').click() # 点击账号密码登录
sleep(1) # 延时一秒
qq_name = web.find_element(By.CSS_SELECTOR, '#u') # 定位账号框
qq_pswd = web.find_element(By.CSS_SELECTOR, '#p') # 定位密码框
qq_name.send_keys('账号') # 输入账号
qq_pswd.send_keys('密码') # 输入密码
sleep(1)
web.find_element(By.CSS_SELECTOR, '#login_button').click() # 点击登录
print('点击登录')
sleep(1)
iframe = web.find_element(By.CSS_SELECTOR, '#tcaptcha_iframe') # 找到“嵌套”的iframe
web.switch_to.frame(iframe) # 切换到iframe
sleep(2)
print("寻找滑块")
button = web.find_element(By.CSS_SELECTOR, '#tcaptcha_drag_thumb') # 寻找滑块
sleep(1)
print("开始拖动")
# 开始拖动 perform()用来执行ActionChains中存储的行为
distance = 170
action = ActionChains(web)
action.reset_actions() # 清除之前的action
action.click_and_hold(button).perform() # click_and_hold 点击并保持
action.move_by_offset(distance, 0).perform()
action.release().perform() # 释放action # 这个释放有点问题,所以用下一行代码代替
# button.click() # 点击滑块(作为释放)
print('登录成功!')
sleep(10)
web.quit() # 推出浏览器