青柠学长 2022-08-03 16:52 采纳率: 83.3%
浏览 203
已结题

python实现循环登录不同账号

怎么利用python实现循环登录不同账号?
因为我需要登录不同账号做一件同样的事情 , 做完这些事情后又退出登录 , 切换不同账号登录做同样的事情

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from PIL import Image
import ddddocr
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome() #实例化对象
URL = "XXXXXXXXXXXXXXXXXX"   #我的工作地址

username = ['xxxxxx','xxxxxx']  #储存的是账号
password = ['**********','*******']    #储存的密码


# 打开登录页面
def sta():
    driver.maximize_window()  # 将浏览器最大化
    # 打开地址栏
    driver.get(URL)
    time.sleep(2)  # 等待两秒加载网页


# 将验证码截图并保存
def sav():
    # 1.将注册页面截图保存,这里需要以png结尾,其他图片格式会有warning
    driver.save_screenshot("F:/screenshot/img.png")
    # 2.定位到验证码图片元素
    code_ele = driver.find_element(By.XPATH, "//img[@class='vcode']")
    # 3.得到将元素的具体位置
    x0 = code_ele.location["x"]  # 565
    y0 = code_ele.location["y"]  # 478
    x1 = code_ele.size["width"] + x0
    y1 = code_ele.size["height"] + y0
    img = Image.open("F:/screenshot/img.png")
    image = img.crop((x0, y0, x1, y1))  # 左、上、右、下
    image.save("F:/screenshot/code_img.png")  # 将验证码图片保存为code_img.png


# 调用验证码识别库
def reco():
    ocr = ddddocr.DdddOcr()
    with open("F:/screenshot/code_img.png", 'rb') as f:
        image = f.read()
    res = ocr.classification(image)
    return (res)


# 输入用户信息及验证码
def input1():
    driver.find_element(By.XPATH, '//input[@placeholder="请输入用户名/手机"]').send_keys()  # 输入账号
    driver.find_element(By.XPATH, '//input[@placeholder="请输入密码"]').send_keys()  # 输入密码
    driver.find_element(By.XPATH, '//input[@placeholder="请输入验证码"]').send_keys(reco())  # 输入验证码
    time.sleep(1)
    driver.find_element(By.XPATH, '//button[@type="button"]').click()  # 点击登录
    time.sleep(2)  # 等待跳转至首页


# 判断验证码是否正确
def while_login():
    while True:
        try:
            driver.find_element(By.CLASS_NAME, "eb-sidebar-logo-collapsed")  # 如果找到了首页这个元素则停止循环
            break
        # 若没有找到首页元素标识,则一直循环识别验证码,输入并登录
        except:
            sav()
            reco()
            driver.find_element(By.XPATH, '//input[@placeholder="请输入验证码"]').clear()
            driver.find_element(By.XPATH, '//input[@placeholder="请输入验证码"]').send_keys(reco())
            time.sleep(1)
            driver.find_element(By.XPATH, '//button[@type="button"]').click()
            time.sleep(2)


# 退出登录
def exit_login():
    #   将鼠标悬停在设置图标上
    mouse = driver.find_element(By.XPATH, '//i[@aria-label="图标: setting"]')
    ActionChains(driver).move_to_element(mouse).perform()

    #   点击退出登录
    driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div/div[2]/div/div/div/div[3]/div[4]').click()

    #   等待弹窗加载,确定退出
    time.sleep(2)
    driver.find_element(By.XPATH, '//button[@type="button" and @class="eb-btn eb-btn-primary"]').click()


if __name__ == '__main__':
    sta()
    sav()
    input1()
    while_login()
    exit_login()

driver.close()  # 关闭浏览器
  • 写回答

2条回答 默认 最新

  • herosunly Python领域优质创作者 2022-08-03 17:07
    关注

    大概是这样的,具体一些参数啥的,你自己填下:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    from PIL import Image
    import ddddocr
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    from selenium.webdriver.common.action_chains import ActionChains
     
    URL = "XXXXXXXXXXXXXXXXXX"   #我的工作地址
     
    username = ['xxxxxx','xxxxxx']  #储存的是账号
    password = ['**********','*******']    #储存的密码
     
     
    # 打开登录页面
    def sta():
        driver = webdriver.Chrome() #实例化对象
        driver.maximize_window()  # 将浏览器最大化
        # 打开地址栏
        driver.get(URL)
        time.sleep(2)  # 等待两秒加载网页
        return driver
     
     
    # 将验证码截图并保存
    def sav(driver):
        # 1.将注册页面截图保存,这里需要以png结尾,其他图片格式会有warning
        driver.save_screenshot("F:/screenshot/img.png")
        # 2.定位到验证码图片元素
        code_ele = driver.find_element(By.XPATH, "//img[@class='vcode']")
        # 3.得到将元素的具体位置
        x0 = code_ele.location["x"]  # 565
        y0 = code_ele.location["y"]  # 478
        x1 = code_ele.size["width"] + x0
        y1 = code_ele.size["height"] + y0
        img = Image.open("F:/screenshot/img.png")
        image = img.crop((x0, y0, x1, y1))  # 左、上、右、下
        image.save("F:/screenshot/code_img.png")  # 将验证码图片保存为code_img.png
     
     
    # 调用验证码识别库
    def reco():
        ocr = ddddocr.DdddOcr()
        with open("F:/screenshot/code_img.png", 'rb') as f:
            image = f.read()
        res = ocr.classification(image)
        return (res)
     
     
    # 输入用户信息及验证码
    def input1(driver, username, passwd):
        driver.find_element(By.XPATH, '//input[@placeholder="请输入用户名/手机"]').send_keys(username)  # 输入账号
        driver.find_element(By.XPATH, '//input[@placeholder="请输入密码"]').send_keys(passwd)  # 输入密码
        driver.find_element(By.XPATH, '//input[@placeholder="请输入验证码"]').send_keys(reco())  # 输入验证码
        time.sleep(1)
        driver.find_element(By.XPATH, '//button[@type="button"]').click()  # 点击登录
        time.sleep(2)  # 等待跳转至首页
     
     
    # 判断验证码是否正确
    def while_login(driver):
        while True:
            try:
                driver.find_element(By.CLASS_NAME, "eb-sidebar-logo-collapsed")  # 如果找到了首页这个元素则停止循环
                break
            # 若没有找到首页元素标识,则一直循环识别验证码,输入并登录
            except:
                sav()
                reco()
                driver.find_element(By.XPATH, '//input[@placeholder="请输入验证码"]').clear()
                driver.find_element(By.XPATH, '//input[@placeholder="请输入验证码"]').send_keys(reco())
                time.sleep(1)
                driver.find_element(By.XPATH, '//button[@type="button"]').click()
                time.sleep(2)
     
     
    # 退出登录
    def exit_login(driver):
        #   将鼠标悬停在设置图标上
        mouse = driver.find_element(By.XPATH, '//i[@aria-label="图标: setting"]')
        ActionChains(driver).move_to_element(mouse).perform()
     
        #   点击退出登录
        driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div/div[2]/div/div/div/div[3]/div[4]').click()
     
        #   等待弹窗加载,确定退出
        time.sleep(2)
        driver.find_element(By.XPATH, '//button[@type="button" and @class="eb-btn eb-btn-primary"]').click()
        driver.quit()  # 关闭浏览器
     
    if __name__ == '__main__':
        URL = "XXXXXXXXXXXXXXXXXX"   #我的工作地址
    
        for i in range(len(username)):
            single_username = username[i]
            single_passwd = password[i]
    
            driver = sta()
            sav(driver)
            input1(driver, single_username, single_passwd)
            while_login(driver)
            exit_login(driver)
     
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • hotswwkyo 2022-08-03 17:20
    关注

    用测试框架加数据驱动就能 实现 给你个示例

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    
    import stest
    from stest import Test as testcase
    from stest.dm import DRIVER_MANAGER
    from stest.dm import WIN_APP_DRIVER_HELPER
    from stest import AbstractTestCase as BaseTestCase
    
    from smart_ops_test.testobjects.pages.vncviewer_page import VNCViewerPage
    
    
    class VNCViewerPageTest(BaseTestCase):
        """使用WinAppDriver.exe测试Window应用程序VNCViewer示例"""
        @classmethod
        def setUpClass(self):
    
            WIN_APP_DRIVER_HELPER.startup_winappdriver(r"E:\Program Files (x86)\Windows Application Driver\WinAppDriver.exe")
    
        def setUp(self):
    
            pass
    
        @testcase(author="siwenwei", groups=["debug"], description='使用正确密码连接远程电脑桌面')
        def connect_remote_pc_desktop(self, testdata):
    
            ip = testdata.get("远程桌面登录账户")
            pwd = testdata.get("远程桌面登录密码")
            vnc_title = "VNC Viewer : Authentication [No Encryption]"
            desired_capabilities = {}
            desired_capabilities["app"] = r"C:\Users\cfgdc-pc 98\Desktop\vnc-4_1_2-x86_win32_viewer.exe"  # vnc viewer 的执行路径
            server_url = "http://127.0.0.1:4723"
            page = VNCViewerPage()
            page.open_window_app(server_url, desired_capabilities)
    
            page.actions.sleep(5).server_ip(ip).sleep(1).ok()
            # 上面点击ok后,到下一个界面显示出来需要时间,所以这里设置延时等待
            page.switch_window_by_title(vnc_title, timeout=20).actions.pwd(pwd).sleep(2).ok()
    
        def tearDown(self):
    
            self.sleep(7)
    
        @classmethod
        def tearDownClass(self):
    
            DRIVER_MANAGER.close_all_drivers()
            WIN_APP_DRIVER_HELPER.shutdown_winappdriver()
    
    
    if __name__ == "__main__":
        stest.main()
    

    用例数据excel文件传入不同组数据

    img

    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月3日
  • 已采纳回答 8月3日
  • 修改了问题 8月3日
  • 赞助了问题酬金10元 8月3日
  • 展开全部

悬赏问题

  • ¥15 欧姆龙PLC 电机控制 限位
  • ¥30 如何处理shell命令接收到的视频流并实时播放出来
  • ¥15 虚心请教C#的代码优化问题
  • ¥15 有偿求做台风过境全过程模拟仿真
  • ¥50 求!AutomationDesk 如何自动导入Variant数据
  • ¥20 Next.JS 静态导出路由
  • ¥15 我做一个对中文文本情感分析的项目 我用了CNN,和keras框架 报的错误我一直处理不好
  • ¥15 unity使用bakery打光烘焙所遇到的问题。
  • ¥99 二维有限元方法求解,泊松方程
  • ¥35 我需要在PC端 开两个抖店工作台客户端.(语言-java)