代码
# 1、导包/提供python的库
from time import sleep
from selenium import webdriver
from selenium.webdriver import ActionChains
# 2、实例化浏览器对象:类名()
driver = webdriver.Chrome()
# 3、打开网址(此处可以替换你要巡检的网页)
driver.get('https://vika.cn/workbench/mirPTLa3fERa5Vt3Jt/dstyWW2rd6RgoKBxml/viwPVtNmkrHSC')
#driver.get('https://18826227807:Stqer686@vika.cn/workbench/mirPTLa3fERa5Vt3Jt/dstyWW2rd6RgoKBxml/viwPVtNmkrHSC')
# 4、时间轴看效果
sleep(5)
# 5、操作命令插入到这里
# 5.1、最大化
driver.maximize_window() # 最大化浏览器
# 5.2、鼠标单击切换到账号密码登录界面
# 5.2.1、点击“手机/邮件登录”按钮
# 定位目标
ele = driver.find_element_by_xpath('//*[@id="VIKA_LOGIN"]/div[1]/div/button/span')
# 实例化 鼠标对象
action = ActionChains(driver)
# 鼠标单击
action.click(ele)
# 鼠标执行操作!!!不执行没效果
action.perform()
# 5.2.2、点击“密码登录”按钮
# 定位目标
ele = driver.find_element_by_xpath('//*[@id="VIKA_CHANGE_MODE_BTN"]/span')
# 实例化 鼠标对象
action = ActionChains(driver)
# 鼠标单击
action.click(ele)
# 鼠标执行操作!!!不执行没效果
action.perform()
# 5.3、输入账号密码
ele = driver.find_element_by_xpath('//*[@id="VIKA_LOGIN_PHONE_INPUT"]')
ele.send_keys('1---')
ele = driver.find_element_by_xpath('//*[@id="VIKA_LOGIN_PASSWORD_INPUT"]')
ele.send_keys('---')
# 5.4、点击“确认”按钮
# 定位目标
#ele = driver.find_element_by_css_selector('#VIKA_LOGIN_BTN')
ele = driver.find_element_by_css_selector('[class="sc-dkPtyc dgAokf style_loginButton__hzwDO"]')
# 实例化 鼠标对象
action = ActionChains(driver)
# 鼠标单击
action.click(ele)
# 鼠标执行操作!!!不执行没效果
action.perform()
# 5.5、滑动验证框
#import selenium.webdriver.support.ui as ui
#wait = ui.WebDriverWait(driver,10)
#wait.until(lambda driver: driver.find_element_by_方法("定位路径自己来"))
#wait.until(lambda driver: driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div/div[3]/div/div/div/div/div/div[1]'))
#xpath用隐式等待
#driver.implicitly_wait(10)
# 切换frame
#iframe = driver.find_element_by_xpath('//iframe') # 找到“嵌套”的iframe
#driver.switch_to.frame(iframe) # 切换到iframe
# 定位目标
# 相对路径
#button = driver.find_element_by_xpath('//*[@id="nc_1_wrapper"]')
#button = driver.find_element_by_xpath('//*[@id="nc_1__bg"]')
# 绝对路径
#button = driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div/div[3]/div/div/div/div/div/div[1]')
#button = driver.find_element_by_xpath('/html/body/div[2]/div/div[2]/div/div/div[3]/div/div/div/div/div/span')
# id定位
#button = driver.find_element_by_css_selector('#nc_1__bg')
# class
#button = driver.find_element_by_css_selector('[class="nc_bg"]')
# css
# 语法id:#id属性值
#button = driver.find_element_by_css_selector('#c_1__bg')
## 语法class:.class属性值 如: '.talA'
# 语法class有多个属性值的时候:[class="全部属性值"]
#button = driver.find_element_by_css_selector('[class="nc_bg"]')
#button = driver.find_element_by_css_selector('[class="nc_iconfont btn_slide"]')
## 语法属性选择器
#button = driver.find_element_by_css_selector('input[id="c_1__bg"]')
#button = driver.find_element_by_css_selector('[name="wd"]')
## 语法层级选择器
## 父层级策略 > 子层级策略
#button = driver.find_element_by_css_selector('#s_kw_wrap>input')
#button = driver.find_element_by_css_selector('#form input')
# 实例化鼠标
#action = ActionChains(driver)
# perform()用来执行ActionChains中存储的行为
#action.click_and_hold(button).perform()
#action.reset_actions()
# 移动滑块
#action.move_by_offset(290,290).perform()
# 5.5、滑动验证框
# 5.5、绕开验证码cookie登录
# 1、整理cookie信息为字典数据,对应的是name和value,保存的一个变量中
#cookie_value = {'name':'BDUSS',
#'value':'--'}
#2、调用方法添加cookie
#driver.add_cookie(cookie_value)
#3、刷新页面 -->发送cookie给服务器验证
#driver.refresh()
# 5.6、时间轴看效果
sleep(15)
# 5.7、截图
driver.get_screenshot_as_file('./a.png')
import requests
import base64
import hashlib
# 8、图片base64码:提供给企业微信发送图片信息所需
with open("./a.png", "rb") as f:
base64_data = base64.b64encode(f.read()).decode()
# base64.b64decode(base64data)
print(base64_data)
# 9、图片的md5值
file = open("./a.png", "rb")
md = hashlib.md5()
md.update(file.read())
res1 = md.hexdigest()
print(res1)
# 10、企业微信机器人发送消息:提供给企业微信发送图片信息所需
url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=1bd9d632-1f3b-445d-98e8-429a1d7415xx"
headers = {"Content-Type": "text/plain"}
data = {
"msgtype": "image",
"image": {
"base64": base64_data,
"md5": res1
}
}
r = requests.post(url, headers=headers, json=data)
print(r.text)
部分讲解
5.5、滑动验证框
起初,通过xpth元素进行定位,但是出现意外
使用selenium模拟登录解决滑块验证
# 5.5、滑动验证框
button = driver.find_element_by_xpath('//*[@id="nc_1_n1z"]')
# 实例化鼠标
action = ActionChains(driver)
# perform()用来执行ActionChains中存储的行为
action.click_and_hold(button).perform()
action.reset_actions()
# 移动滑块
action.move_by_offset(180, 0).perform()
第一步:通过元素定位,已经知道滑动验证框的xpth路径了,但是还是报错
查看https://blog.youkuaiyun.com/u012067766/article/details/79793264得知有可能是存在frame
但是,ctrl+f搜索,没有iframe
换成class元素定位试试
还是报错
换成id也不行
我再找https://blog.youkuaiyun.com/cojn52/article/details/87775307,可能元素加载未完成,不过不大可能
#xpath用隐式等待
driver.implicitly_wait(10)
但是好像没有报错了
但是还是没有滑动,去掉上述命令还是报错
这个报错有毒,继续查https://blog.youkuaiyun.com/MrLevo520/article/details/51954203
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {“method”:“xpath”,“selector”:“//*[@id=“nc_1_wrapper”]”}
(Session info: chrome=104.0.5112.102)
import selenium.webdriver.support.ui as ui
wait = ui.WebDriverWait(driver,10)
#wait.until(lambda driver: driver.find_element_by_方法("定位路径自己来"))
wait.until(lambda driver: driver.find_element_by_xpath("//*[@id="nc_1__bg"]"))
我觉得我就是这个吧
继续看看元素定位有没有问题
https://blog.youkuaiyun.com/qq_54219272/article/details/123310772
该按钮有两个
一是
二是
都试下
#xpath
//*[@id="nc_1_n1z"]
//*[@id="nc_1__bg"]
# full xpath
/html/body/div[2]/div/div[2]/div/div/div[3]/div/div/div/div/div/div[1]
/html/body/div[2]/div/div[2]/div/div/div[3]/div/div/div/div/div/span
# 元素
<div id="nc_1__bg" class="nc_bg" style="width: 24px;"></div>
<span id="nc_1_n1z" class="nc_iconfont btn_slide" style="left: 0px;"></span>
绝对路径也是报错
尝试用鼠标移动滑块
https://blog.youkuaiyun.com/huxiaoher/article/details/90266308