ChromeDriver.install() bug
Rsalganik1123 opened this issue · comments
When trying to replicate the ChromeDriver example in the documentation, I get the following error : AttributeError: 'NoneType' object has no attribute 'split'
To reproduce:
from selenium import webdriver
from selenium.common import NoSuchElementException
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
Used to work but suddenly doesn't -- maybe there was some update I'm not aware of?
same issue here
Something similar here with a slightly different error. On my Mac M3 I get the following error.
WebDriverException: Message: Service /Users/briandekeijzer/.wdm/drivers/chromedriver/mac64/119.0.6045.105/chromedriver-mac-arm64/chromedriver unexpectedly exited. Status code was: -9
I fixed this a couple of days ago by reinstalling selenium and webdriver_manager through pip. But for some reason the error is back. My env has not changed. Running the same fix doesn't resolve the issue.
To reproduce use:
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
On Python 3.9 with selenium version 4.16.0 and webdriver-manager version 4.0.1.
Edit:
A temporary fix is to remove the .wdm folder and --upgrade the package.
rm -rf /Users/briandekeijzer/.wdm
pip install --upgrade webdriver_manager
Likely culprit:
It looks like webdriver manager can't resolve the webdriver path.
This likely means one of 3 things, it can't find chrome, it can't find chromedriver, or it can't map the correct version of chrome to the correct version of chromedriver.
Traceback
2024-01-14 18:38:15 driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
2024-01-14 18:38:15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-14 18:38:15 File "/usr/local/lib/python3.11/site-packages/webdriver_manager/chrome.py", line 40, in install
2024-01-14 18:38:15 driver_path = self._get_driver_binary_path(self.driver)
2024-01-14 18:38:15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-14 18:38:15 File "/usr/local/lib/python3.11/site-packages/webdriver_manager/core/manager.py", line 40, in _get_driver_binary_path
2024-01-14 18:38:15 file = self._download_manager.download_file(driver.get_driver_download_url(os_type))
2024-01-14 18:38:15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-14 18:38:15 File "/usr/local/lib/python3.11/site-packages/webdriver_manager/drivers/chrome.py", line 32, in get_driver_download_url
2024-01-14 18:38:15 driver_version_to_download = self.get_driver_version_to_download()
2024-01-14 18:38:15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-14 18:38:15 File "/usr/local/lib/python3.11/site-packages/webdriver_manager/core/driver.py", line 48, in get_driver_version_to_download
2024-01-14 18:38:15 return self.get_latest_release_version()
2024-01-14 18:38:15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-14 18:38:15 File "/usr/local/lib/python3.11/site-packages/webdriver_manager/drivers/chrome.py", line 64, in get_latest_release_version
2024-01-14 18:38:15 determined_browser_version = ".".join(determined_browser_version.split(".")[:3])
2024-01-14 18:38:15 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2024-01-14 18:38:15 AttributeError: 'NoneType' object has no attribute 'split'
I don't see how this code was ever able to work. Is it required for chrome to be installed?
determined_browser_version = self.get_browser_version_from_os()
log(f"Get LATEST {self._name} version for {self._browser_type}")
if determined_browser_version is not None and version.parse(determined_browser_version) >= version.parse("115"):
...
return determined_browser_version
# at this point, determined_browser_version can be None if chrome is not installed, so splitting cannot work
determined_browser_version = ".".join(determined_browser_version.split(".")[:3])
latest_release_url = (
self._latest_release_url
if (determined_browser_version is None)
else f"{self._latest_release_url}_{determined_browser_version}"
)
I am creating a PR right away
Same problem here
Temporary solution is to install the webdriver manually
for ubuntu: sudo apt install chromium-driver
Temporary solution is to install the webdriver manually for ubuntu:
sudo apt install chromium-driver
This doesn't work for me. I alternatively installed a full-sized chrome with sudo apt install chromium
.
Temporary solution is to install the webdriver manually for ubuntu:
sudo apt install chromium-driver
This doesn't work for me. I alternatively installed a full-sized chrome with
sudo apt install chromium
.
Yeah that's the bug. I think when this repository was originally designed, it was designed with local instances of browsers in mind, and not remote browsers/browser-servers. So, with the original design, you had to have a local installation available.
I am having this same issue except I am attempting to run some scraping with Selenium in MWAA. Does anyone have any tips on how I could resolve it there?
I was running into this issue when using webdriver_manager
in Python 3.
Solution:
- Get chromedriver with
sudo apt install chromium-driver
- Skip the install and specify the Service path directly:
chromedriver_path = '/usr/bin/chromedriver' # or wherever chromedriver is installed for you
driver = webdriver.Chrome(options=options, service=Service(chromedriver_path))
For context this was the problematic code before running into the same issues others cited above:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
options = Options()
options.headless = args.headless
driver = webdriver.Chrome(
options=options, service=Service(ChromeDriverManager().install())
)
The simplest fix for this is just to set the driver_version, I set mine to "120" and the download worked fine. It looks like the OperationSystemManager class is unable to identify the most recent version of chrome.
def get_latest_release_version(self):
determined_browser_version = self.get_browser_version_from_os()
log(f"Get LATEST {self._name} version for {self._browser_type}")
if determined_browser_version is not None and version.parse(determined_browser_version) >= version.parse("115"):
url = "https://googlechromelabs.github.io/chrome-for-testing/latest-patch-versions-per-build.json"
response = self._http_client.get(url)
response_dict = json.loads(response.text)
determined_browser_version = response_dict.get("builds").get(determined_browser_version).get("version")
return determined_browser_version
# Remove the build version (the last segment) from determined_browser_version for version < 113
determined_browser_version = ".".join(determined_browser_version.split(".")[:3])
latest_release_url = (
self._latest_release_url
if (determined_browser_version is None)
else f"{self._latest_release_url}_{determined_browser_version}"
)
resp = self._http_client.get(url=latest_release_url)
return resp.text.rstrip()
I think it would be a good idea to check that determined_browser_version isn't None before being split, and just set it to a hard coded default value if it is. Or it might even better better to fix upstream in get_browser_version_from_os, and make that return a hard coded default value.
Solution:
from webdriver_manager.chrome import ChromeDriverManager
print(ChromeDriverManager(driver_version='120').install())