chromedriver自动下载 —— python

# 工作实践

webdriver自带的ChromeDriverManager().install()方法,对应的驱动地址自从114版本后没有更新了;隔一段时间就需要手动下载驱动,所以写了一个简单的自动更新方法,还有一些不足,勉强够用吧

1、查看源码,大致是保存了一个json文件,每次获取driver最后更新版本,并更新到json文件中;然后下载最新的资源并解压到文件夹

2、本来想改源码,但是有修改提示,考虑以后移动或更新webdriver可能会无法使用,打算写一个简单的功能来实现

3、该方法仅在win32下实现,其他环境如win64(版本不一样)或Linux(解压方法还有版本等不一样)不能

class BrowserEngine(object):
    driver_version = ""     # 设置变量,用于获取最新版本号,并拼接到下载地址中


    def open_browser(self):
        """
        打开浏览器
        :param browser:
        :return

        """

        browser = Config().get('browserName') 
        try:

            if browser == "Chrome":
                # 运行结束后不自动关闭浏览器
                # options = webdriver.ChromeOptions()
                # options.add_experimental_option("detach", True)
                # self.driver = webdriver.Chrome(ChromeDriverManager().install())  # 链接过期了
                self.driver = webdriver.Chrome()
            elif browser == "edge":
                self.driver = webdriver.Edge(EdgeChromiumDriverManager().install())
            elif browser == "Firefox":
                self.driver = webdriver.Firefox(GeckoDriverManager().install())

            self.driver.maximize_window()
            logger.info("Maximize the current window.")
            self.driver.implicitly_wait(10)
            logger.info('打开【{}】浏览器' .format(browser))
            return self.driver

        except Exception as e:
            logger.error('打开【{}】浏览器'.format(browser, e))
            self.driver = webdriver.Chrome(self.laster_chromedriver_version())
            self.driver.maximize_window()
            logger.info("Maximize the current window.")
            self.driver.implicitly_wait(10)
            logger.info('打开【{}】浏览器'.format(browser))
            return self.driver



    # 自动更新chromedriver
    def Chrome_install(self):
        # 自己项目和环境变量相对应的目录!!!
        zip_path = r"D:\Anaconda\selenium\webdriver\Chromedriver\chromedriver.zip"
        chrome_zip_path = r"D:\Anaconda\selenium\webdriver\chromedriver"
        chrome_path = r"D:\Anaconda\selenium\webdriver\chromedriver\chromedriver.exe"
        chrome_url = r"https://storage.googleapis.com/chrome-for-testing-public/"
        response = requests.get(chrome_url+BrowserEngine.driver_version+"/win32/chromedriver-win32.zip", verify=False)
        with open(zip_path, 'wb') as f:
            f.write(response.content)

        # 文件解压
        zip_class = zipfile.ZipFile
        archive = zip_class(zip_path)
        archive.extractall(chrome_zip_path)

        # 移动到目标文件夹并替换原文件
        new_chrome = os.path.join(chrome_zip_path, "chromedriver-win32\\chromedriver.exe")
        if os.path.exists(chrome_path):
            os.remove(chrome_path)
            shutil.move(new_chrome, chrome_zip_path)
        else:
            shutil.move(new_chrome, chrome_zip_path)
            os.remove(zip_path)
        return chrome_zip_path

    # 获取最近一次驱动版本并对比
    def laster_chromedriver_version(self):
        r = requests.get("https://googlechromelabs.github.io/chrome-for-testing/#stable/Version")
        result1 = r.text
        latest_release_url_list = re.findall(r'(.*?)', result1, )
        latest_release_url = latest_release_url_list[0]
        dir_cwd = os.getcwd()
        dir_json = os.path.join(dir_cwd, "driver_version.json")
        with open(dir_json, "r", encoding="utf-8") as f:
            data = json.load(f)

        #若最后版本和json中不一致,则更新文档并调用更新方法
        if data["Chromedriver_version"] != latest_release_url:
            data["Chromedriver_version"] = latest_release_url
            BrowserEngine.driver_version = latest_release_url
            with open(dir_json, "w", encoding="utf-8") as f:
                json.dump(data, f)

            chrome_path = self.Chrome_install()
            return chrome_path


if __name__ == '__main__':
    driver = BrowserEngine()
    driver.laster_chromedriver_version()

遇到问题:

一开始把版本号记录到yml文件中,发现每次更新时会将yml文件内容都更新,且没有保留注释和先后顺序,所以单独写到json文件中了;也可以将配置信息写到ini中,只更新某个值;或者使用其他包保留yml文件的注释和顺序

json文件的读写不能放一个打开文件with open(),总是报错,网络查询都是json文件的格式原因,但是文件是正常的,后来把读取和写入分开功能正常了

存在问题:

1、运行的时候驱动正常下载并解压,也移动到目标目录下,但是没有启动浏览器;再次运行能正常打开浏览器(驱动已经是最新的)

2、调试的时候chromedriver.exe无法删除,提示正在运行;实际运行脚本时应该可以避免这种情况(要么是最新的直接运行,else 不是最新的无法启动,则可以正常删除)

你可能感兴趣的:(python,开发语言)