IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> 22.2.14--B站登录内附代码-for循环列表形式-‘’no attribute ‘’-‘’needs to be in PATH-selenium截图偏差-crop裁剪错误-BytesIO()等 -> 正文阅读

[开发测试]22.2.14--B站登录内附代码-for循环列表形式-‘’no attribute ‘’-‘’needs to be in PATH-selenium截图偏差-crop裁剪错误-BytesIO()等

尝试B站登入,遇到的问题大致如下。

学习的是崔庆才编写的《python3网络爬虫开发实战》

1.EC显示等待模块中需要加括号

2.for循环的列表形式

3.报错:'click_image' object has no attribute 'wait'

4.报错:chromedriver' executable needs to be in PATH

5.报错:presence_of_element_located() takes 1 positional argument but 2 were given

6.报错:int() argument must be a string, a bytes-like object or a number, not 'list'

7.selenium截图出现偏差

8.crop()函数裁剪错误

9.BytesIO()的用法

10.file.getvalue()的用法

(一)1.EC显示等待模块中需要加括号

EC显示模块,看代码

    def login_in(self):
        self.browser.get(self.url)
        self.browser.maximize_window()
        username = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username' )))
        password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd' )))
        button = self.wait.until(EC.element_to_be_clickable((By.LINK_TEXT,'登录')))
        username.send_keys(bilibili_username)
        password.send_keys(bilibili_password)
        button.click()
        time.sleep(2)

注意EC.presence_of_element_located()这个函数里面的是需要写成

EC.presence_of_element_located((By.ID, 'login-username'))里面需要有一个括号

(二)2.for循环的列表形式

for循环有两种方式,这次遇到的写法是这样子的

    def get_points(self,captch_result):
        '''
        :param captch_result: 超级鹰输出的
        :return:
        '''
        groups = captch_result.get('pic_str').split('|')
        locations = [[int(number) for number in group.split(',')] for group in groups]
        return locations

其中int(number)是输出的内容,

for number in group.split(',') 是内层循环
for group in groups 是外层循环

不过输出的内容是啥样的我还不是很清楚,待续。

(三)报错:'click_image' object has no attribute 'wait'

? ? ? ? EC显示等待

class click_image():
    def first_login(self):
        self.url = 'https://passport.bilibili.com/login'
        self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser,20)
        self.chaojiying = Chaojiying(chaojiying_username,chaojiying_password,chaojiying_soft_id)

一开始是这样子的,后来一直给我报错,我将代码更改为

class click_image():
    def __init__(self):
        self.url = 'https://passport.bilibili.com/login'
        self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser,20)
        self.chaojiying = Chaojiying(chaojiying_username,chaojiying_password,chaojiying_soft_id)

将函数名称换成了__init__(self):就可以了

(四)chromedriver' executable needs to be in PATH

这个只需要将chromedriver.exe 分别放入 含有chrome.exe 和python37的文件夹里,再将chromedriver.exe放入环境变量的系统PATH中即可,如下

?之后再右键我的电脑-属性-高级系统设置-环境变量-双击系统变量中的path-新建,将

上图中的地址:C:\Users\15466\AppData\Local\Google\Chrome\Application

放入之后,一路确定即可。

(五)presence_of_element_located() takes 1 positional argument but 2 were given

?解决方法就是第一个里面提到的

(六)int() argument must be a string, a bytes-like object or a number, not 'list'

    def touch_click(self,locations):
        for location in locations:
            print(location)
            ActionChains(self.browser).move_to_element_with_offset(self.get_image(),location[0],
                                                                   location[1]).click().perform()
            time.sleep(1)

↑↑↑这个是正确的。

当时我报错的原因是在:

ActionChains(self.browser).move_to_element_with_offset(self.get_image(),locations[0],
                                                       locations[1]).click().perform()

是的,仔细看就会发现我在location的后面加了一个s

(七)selenium截图出现偏差

1.电脑系统的缩放比例

我这里是125%?,所以只需要改成100%,然后重启电脑就可以

2.在后续的坐标乘以1.25(如下)

    def crop_screenshot(self,name='captch.png'):
        top,bottom,left,right= self.get_image_location()
        screenshot = self.get_screenshot()
        captch = screenshot.crop((left*1.25,top*1.25,right*1.25,bottom*1.25))
        captch.save(name)
        return captch

3.还有一个,反正我懒得看了

(八)crop()函数裁剪错误

    def crop_screenshot(self,name='captch.png'):
        top,bottom,left,right= self.get_image_location()
        screenshot = self.get_screenshot()
        captch = screenshot.crop((left,top,right,bottom))
        captch.save(name)
        return captch

crop(x,y,x+width,y+height)

但是一开始脑抽写的是

captch = screenshot.crop((top,bottom,left,right))

可把孩子愁坏了。

(九)BytesIO()的用法

BytesIO实现了在内存中读写bytes

可以

file = BytesIO()

来创建一个文件夹

(十)file.getvalue()的用法

有人解释下吗,我不理解。。。

附上代码:

from PIL import Image
from pach.chaojiying_Python.chaojiying import Chaojiying
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains
import time
from io import BytesIO
'''准备工作'''
chaojiying_username = '超级鹰用户名'
chaojiying_password = '超级鹰密码'
chaojiying_soft_id = '软件ID'
chaojiying_kind = '验证码类型'
bilibili_username = 'B站账号'
bilibili_password = 'B站密码'

class click_image():
    def __init__(self):
        self.url = 'https://passport.bilibili.com/login'
        self.browser = webdriver.Chrome()
        self.wait = WebDriverWait(self.browser,20)
        self.chaojiying = Chaojiying(chaojiying_username,chaojiying_password,chaojiying_soft_id)
    def login_in(self):
        self.browser.get(self.url)
        self.browser.maximize_window()
        username = self.wait.until(EC.presence_of_element_located((By.ID, 'login-username' )))
        password = self.wait.until(EC.presence_of_element_located((By.ID, 'login-passwd' )))
        button = self.wait.until(EC.element_to_be_clickable((By.LINK_TEXT,'登录')))
        username.send_keys(bilibili_username)
        password.send_keys(bilibili_password)
        button.click()
        time.sleep(2)
    def close(self):
        self.browser.close()
    def get_image(self):
        images = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME,'geetest_item_img')))
        return images
    def get_image_location(self):
        images = self.get_image()
        location = images.location
        size = images.size
        top,bottomm,left,right = location['y'],location['y']+size['height'],location['x'],location['x']+size['width']
        return (top,bottomm,left,right)
    def get_screenshot(self):
        screenshot = self.browser.get_screenshot_as_png()
        screenshot = Image.open(BytesIO(screenshot))
        return screenshot
    def crop_screenshot(self,name='captch.png'):
        top,bottom,left,right= self.get_image_location()
        screenshot = self.get_screenshot()
        captch = screenshot.crop((left,top,right,bottom))
        captch.save(name)
        return captch
    def get_points(self,captch_result):
        '''
        :param captch_result: 超级鹰输出的
        :return:
        '''
        groups = captch_result.get('pic_str').split('|')
        locations = [[int(number) for number in group.split(',')] for group in groups]
        return locations
    def touch_click(self,locations):
        for location in locations:
            print(location)
            ActionChains(self.browser).move_to_element_with_offset(self.get_image(),location[0],
                                                                   location[1]).click().perform()
            time.sleep(1)
    def login_click(self):
        button = self.wait.until(EC.element_to_be_clickable((By.LINK_TEXT,'确认')))
        button.click()
    def bilibili_login(self):
        self.login_in()
        captch = self.crop_screenshot()
        file = BytesIO()
        captch.save(file , format='PNG' )
        result = self.chaojiying.post_pic(file.getvalue(),chaojiying_kind)
        print(result)
        locations = self.get_points(result)
        self.touch_click(locations)
        self.login_click()

if __name__ == '__main__':
    login = click_image()
    login.bilibili_login()

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2022-02-16 13:25:12  更:2022-02-16 13:26:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/18 2:47:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码