admin管理员组

文章数量:1616701

基于Selenium实现网易云音乐的登录

  • 前言
  • 一、准备工作
    • 1.环境配置
    • 2.确定页面的操作步骤
      • ①进入官网
      • ②点击登录
      • ③选择登录方式进行登录
  • 二、代码实现
    • 1.公共方法的封装
    • 2.登录操作
  • 总结


前言

最近在学习Selenium,由于没有项目练手,就拿网易云做了一个简单的练手项目。


一、准备工作

1.环境配置

这里是我的环境,
编程语言:python 3.9
使用的库:selenium 4.1.3
浏览器:Chrome

2.确定页面的操作步骤

首先就要先确定,页面的操作步骤:

①进入官网

网易云音乐的官网链接是 https://music.163/,打开页面是这样的

②点击登录

见上图可知,登录按键有两个,这里我就叫上面的登录按键叫登录1,下面的叫登录2。我这里定位的是登录1,不懂是不是我电脑屏幕太小了,我打开浏览器的尺寸不够,打开网页之后登录1看不到,就没办法定位,于是我就加了全屏的操作,这样就能定位到登录1。如果用登录2的话,就要注意登录2是包在iframe里面的,如果要点击登录2就要切换frame,切换完才能做点击操作。

③选择登录方式进行登录

点击登录后,会出现一个弹窗,这个弹窗最开始是扫码登录,扫码登录Selenium应该是实现不了的,起码我这个菜鸡是没办法实现自动化,所以我们要点击 选择其他登录模式 ,这里有5种登录方式,分别是手机号、微信、QQ、微博、网易邮箱,选择登录方式之前注意要先勾选用户协议。
这里简单分析一下,这5种登录方式的难易程度,这里微信和微博登录,我直接pass掉了,一打开就是扫码登录,我是菜鸡我不会扫码,我要是能扫码就不会选择其他登录方式了;接下来我选择网易邮箱登录,不得不说,网易邮箱看起来真的很方便,但是我没账号(pass);接下来就是手机号登录,手机号登录有两种方法,一个是验证码登录(pass),另一个是账号密码登录,当我成功输入账号密码点击登录之后,蹦出来一个滑块验证!!!(我怀疑网易邮箱登录可能也会有这个验证)而且网易云的滑块验证,滑动距离是会变化的,每次都不一样,导致我这个菜鸡没办法跳过这个验证。
最后我只能选择QQ登录,当我选择QQ登录时,我发现qq登录真是诸多登录方式中的一股清流,QQ登录有三种方法:第一种,扫码(直接pass);第二种,账号密码;第三种,如果有登录的话,就可以直接点击头像进行登录。无论是账号密码登录还是点击头像登录,都没有其他多余的验证(简直是业界良心有木有)。
但是qq登录需要注意的是,点击QQ登录,是跳转到新的页面的,我们就需要做handles的切换,登录完之后,qq登录的页面会自动去掉,但是我们还是要手动切换回网易云的页面。还有一个就是qq登录要先切换iframe,才能做元素定位。

二、代码实现

因为我不只是要做登录操作,后面还要做签到、刷用户等级等功能,所以我就没有写线性代码,我将一些经常用的方法做了封装,比如打开网页、元素定位、元素操作等。

1.公共方法的封装

我创建一个类WebKeys,在初始化函数里面,先创建一个driver对象,设置这个driver对象的屏幕最大化,再设置隐式等待10s,代码如下:

class WebKeys:
    def __init__(self):
        options = webdriver.ChromeOptions()
        options.add_argument('start-maximized')
        self.driver = webdriver.Chrome(options=options)
        self.driver.implicitly_wait(10)

屏幕最大化,有两种方法,一种是通过ChromeOptions这个类,为chrome配置参数,另一种方法就是创建driver对象之后,使用maximize_window方法。这里建议使用第一种方法,maximize_window方法在selenium 2之后就有一个bug,有可能会无故报错,虽然我没碰见过。
接下来我将打开链接的也做了封装,这个没什么好说的,见代码:

    def open(self, url):
        self.driver.get(url)

接下来就是元素定位了,为了方便我们运行的时候看到页面操作了什么元素,所以我先做了元素的框选,只要我定位了什么元素,这个元素就会被描上红线,见代码:

    # 实现元素定位的框选
    def locator_station(self, element):
        self.driver.execute_script(
            "arguments[0].setAttribute('style',arguments[1]);",
            element,
            'border: 2px solid red'  # 边框颜色
        )

框选功能做了,元素定位就要跟上:

    def locator(self, name, value):
        """
        :param name: 元素定位方式
        :param value: 元素定位路径
        :return:
        """
        el = self.driver.find_element(name, value)
        self.locator_station(el)
        return el

接着我又在locator方法的基础之下又封装了两个元素操作的方法,一个是点击click,一个是输入inputs,见代码:

    # 点击
    def click(self, name, value):
        self.locator(name, value).click()
    
    # 输入
    def inputs(self, name, value, text):
        self.locator(name, value).send_keys(text)

前面不是提了一个iframe的切换,我就一起做了封装,见代码:

    # 切换frame
    def change_frame(self, a):
        self.driver.switch_to.frame(a)

    # 切换回主框架
    def change_defaultFrame(self):
        self.driver.switch_to.default_content()

再加一个窗口切换:

    # 窗口切换
    def change_window(self, n):
        # 获取句柄
        handles = self.driver.window_handles
        # 切换到原始页面,n = 0
        # 切换句柄到第二个页面,n = 1 ,以此类推
        self.driver.switch_to.window(handles[n])

2.登录操作

前面将会常用的方法做了封装之后,我要开始做登录操作了,首先我先创建页面类MusicLogin,让它继承WebKeys,为了方便看代码,我在每行都加了备注,对了,如果要用点击头像登录的话,就要先登录qq,然后 xpath 后面的参数要改成自己的,接下来就是代码:

class MusicLogin(WebKeys):
    # 登录
    def login_music(self):
        self.open('https://music.163/')
        self.click('xpath', '//*[contains(text(), "登录")]')
        self.click('link text', '选择其他登录模式')
        # 勾选用户协议
        self.click('css selector', '#j-official-terms')
        time.sleep(0.5)
        # 点击QQ登录
        self.click('xpath', '//body[1]/div[7]/div[1]/div[2]/div[1]/div[2]/div[1]/div[1]/div[1]/div[1]/div[2]/ul[1]/li[2]')
        # 等待句柄
        time.sleep(3)
        # 切换句柄
        self.change_window(1)
        # 切换iframe
        iframe = self.locator('xpath', '//*[@id="ptlogin_iframe"]')
        self.change_frame(iframe)
        # 点击头像进行登录,xpath记得修改
        self.click('xpath', '改这里')
        # 切换回网易云主页
        self.change_window(0)

总结

结果展示:
https://www.bilibili/video/BV1MZ4y1t747?spm_id_from=333.999.0.0
注意:不要玩的太频繁,我的账号就被玩封号了。

本文标签: 网易音乐selenium