使用selenium进行模拟登录

模拟登陆12306
.对12306进行模拟登陆.
需使用到超级鹰. 以对超级鹰板块截切。。。
http://www.chaojiying.com/user/mysoft/

import time
from PIL import Image
from base64 import b64decode
from selenium.webdriver import ActionChains
#对12306界面发请求
bro=webdriver.Chrome(executable_path=chromedriver路径')
bro.get('https://kyfw.12306.cn/')
bro.maximize_window()#网页最大化
time.sleep(3)
#点击到账号登陆
#find_elements_by_xpath无法点击
a=bro.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a')
a.click()
time.sleep(3)
#对整个界面截图
bro.save_screenshot('screen.png')
#用xpath找到验证码位置 定位图片位置,获取 src 的属性值
#get_attribute(‘src’) 会把换行符替换为"%0A",因此解码的时候要替换回去。
code_img_ele=bro.find_element_by_xpath('//*[@id="J-loginImg"]').get_attribute('src')
code_img_name= code_img_ele.split(",")[-1] # 删除前面的 “data:image/jpeg;base64,”
img_str = code_img_name.replace("%0A", '\n')  # 将"%0A"替换为换行符
img_data = b64decode(img_str)  # b64decode 解码
#保存图片
with open('./captcha.jpeg', 'wb') as fout:
    fout.write(img_data)
    fout.close()
```chaojiying = Chaojiying_Client('xxxx', 'xxxxx', '******')	#用户中心>>软件ID 生成一个替换 96001
im = open('./captcha.jpeg', 'rb').read()
#本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print (chaojiying.PostPic(im, 9004)['pic_str'])
result=chaojiying.PostPic(im, 9004)['pic_str']
time.sleep(0.5)
all_list=[]#存储坐标
#定位到验证码的区域
if '|' in result:
    list_1 = result.split('|')#将超级鹰返回的坐标用‘|’分割列表
    count_1=len(list_1)#list_1的长度
    for i in range(count_1):
        xy_list=[]
        x=int(list_1[i].split(',')[0])
        y = int(list_1[i].split(',')[1])
        xy_list.append(x)
        xy_list.append(y)
        all_list.append(xy_list)
else:
    xy_list = []
    x = int(result.split(',')[0])
    y = int(result.split(',')[1])
    xy_list.append(x)
    xy_list.append(y)
    all_list.append(xy_list)
for loc in all_list:
    x=loc[0]
    y=loc[1]
    #实例化动作链,并且定位到验证码图片里进行点击正确的图片
    code_img_eles = bro.find_element_by_xpath('//*[@id="J-loginImg"]')
    ActionChains(bro).move_to_element_with_offset(code_img_eles, x, y).click().perform()
    time.sleep(0.5)
#输入账号与密码
bro.find_element_by_id('J-userName').send_keys('*******')
time.sleep(1)
bro.find_element_by_id('J-password').send_keys('*******')
time.sleep(1)
bro.find_element_by_id('J-login').click()
time.sleep(1)
#出现滑块,并对滑块进行处理
span=bro.find_element_by_id('nc_1_n1z')
action=ActionChains(bro)
action.click_and_hold(span)
action.drag_and_drop_by_offset(span,400,0).perform()
while True:
    try:
        info=bro.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span').text
        print(info)
        if info=='哎呀,出错了,点击刷新再来一次':
            #点击刷新
            bro.find_element_by_xpath('//*[@id="J-slide-passcode"]/div/span/a').click()
            time.sleep(0.2)
            #重新移动滑块
            span = bro.find_element_by_xpath('//*[@id="nc_1_n1z"]')
            action = ActionChains(bro)
            # 点击长按指定的标签
            action.click_and_hold(span).perform()
            action.drag_and_drop_by_offset(span, 400, 0).perform()
            time.sleep(5)
    except:
        print('ok!')
        break
action.release()
time.sleep(50)
bro.quit()



本文仅做供学习交流,内容仅做参考

你可能感兴趣的:(python,selenium)