11import json
2- from typing import Dict
2+ import pathlib
3+ from typing import Dict , Optional
34
45import requests
6+ from pathlib import Path
7+ import zipfile
8+ from io import BytesIO
9+
510from bs4 import BeautifulSoup
611
712from scraper .os_checker import OSChecker
@@ -11,24 +16,23 @@ class ChromePageScraper:
1116 URL_LATEST = (
1217 "https://googlechromelabs.github.io/chrome-for-testing/#stable"
1318 )
14- URL_ALL = "https://googlechromelabs.github.io/chrome-for-testing/latest-versions-per-milestone-with-downloads.json" # noqa
19+ URL_ALL = "https://googlechromelabs.github.io/chrome-for-testing/latest-versions-per-milestone-with-downloads.json"
1520
1621 @staticmethod
1722 def __fetch (url : str ) -> requests .Response :
1823 response = requests .get (url )
19- response .raise_for_status () # Raises an exception if status code is not 200 # noqa
24+ response .raise_for_status ()
2025 return response
2126
2227 @staticmethod
2328 def parse_latest () -> Dict [str , str ]:
24- # returns a latest stable chrome driver
2529 elements_list = []
2630 drivers = {}
2731 page = ChromePageScraper .__fetch (ChromePageScraper .URL_LATEST )
2832
2933 soup = BeautifulSoup (page .text , "html.parser" )
3034 element = soup .select_one (
31- "section#stable.status-not-ok div.table-wrapper table tbody tr.status-ok" # noqa
35+ "section#stable.status-not-ok div.table-wrapper table tbody tr.status-ok"
3236 )
3337
3438 if not element :
@@ -55,12 +59,18 @@ def get_latest_driver(self, os_name: str):
5559 print (drivers [os_name ])
5660
5761 @staticmethod
58- def get_chromedriver (platform = None , version = None , milestone = None ):
62+ def get_chromedriver (platform = None ,
63+ version = None ,
64+ milestone = None ,
65+ d_dir : Optional [pathlib .Path ] = None ,
66+ is_extracted : bool = False
67+ ):
5968 """
60-
6169 :param platform: os_name and architecture
6270 :param version: your chrome browser version
6371 :param milestone: first 3 digits of a browser version: 129 or etc
72+ :param d_dir: Directory to save the chromedriver zip file
73+ :param is_extracted: extracts the chromedriver
6474 :return:
6575 """
6676 if version is None and milestone is None :
@@ -71,6 +81,8 @@ def get_chromedriver(platform=None, version=None, milestone=None):
7181 if platform is None :
7282 platform = OSChecker .check_os ()
7383
84+ download_dir = d_dir or Path (__file__ ).resolve ().parent .parent / "resources"
85+
7486 # Parse the JSON data
7587 parsed_data = json .loads (
7688 ChromePageScraper .__fetch (ChromePageScraper .URL_ALL ).text
@@ -79,18 +91,31 @@ def get_chromedriver(platform=None, version=None, milestone=None):
7991
8092 for milestone_key , milestone_data in milestones_data .items ():
8193 if (milestone is None or milestone_key == milestone ) and (
82- version is None or milestone_data ["version" ] == version
94+ version is None or milestone_data ["version" ] == version
8395 ):
8496 if "chromedriver" in milestone_data ["downloads" ]:
85- for chromedriver_info in milestone_data ["downloads" ][
86- "chromedriver"
87- ]:
97+ for chromedriver_info in milestone_data ["downloads" ]["chromedriver" ]:
8898 if (
89- platform is None
90- or chromedriver_info ["platform" ] == platform
99+ platform is None
100+ or chromedriver_info ["platform" ] == platform
91101 ):
92- return chromedriver_info
102+ url = chromedriver_info ["url" ]
103+ response = requests .get (url )
104+ response .raise_for_status () # Check status
105+
106+ download_dir .mkdir (parents = True , exist_ok = True )
107+ download_path = download_dir / "chromedriver.zip"
108+
109+ with open (download_path , "wb" ) as file :
110+ file .write (response .content )
111+ print (f"Chromedriver downloaded to { download_dir } " )
112+
113+ if is_extracted :
114+ with zipfile .ZipFile (BytesIO (response .content )) as zip_ref :
115+ zip_ref .extractall (download_dir )
93116
117+ print (f"Chromedriver extracted to { download_dir } " )
118+ return download_path
94119
95120if __name__ == "__main__" :
96- print ( ChromePageScraper .get_chromedriver (milestone = "129" ) )
121+ ChromePageScraper .get_chromedriver (milestone = "131" )
0 commit comments