ultrafunkamsterdam / undetected-chromedriver

Custom Selenium Chromedriver | Zero-Config | Passes ALL bot mitigation systems (like Distil / Imperva/ Datadadome / CloudFlare IUAM)
https://github.com/UltrafunkAmsterdam/undetected-chromedriver
GNU General Public License v3.0
9.61k stars 1.14k forks source link

Issue creating multiple drivers [ subprocess : TypeError: expected str, bytes or os.PathLike object, not NoneType ] #726

Open ultrafunkamsterdam opened 2 years ago

ultrafunkamsterdam commented 2 years ago

Actually there seems something wrong using threading.threads and mp.processes, as well as asyncio or even in the main thread

when creating multiple drivers.

I don't know why i even bother since creating multiple drivers is useless and solves no problems. chromedriver is just a messaging proxy passing messages back and forth. and 1 driver can control dozens of windows, each containing a magnitude of tabs (and is designed for that)

that having said

note: all the below has also been done using the (use_subprocess=True)

in Ipython this works fine:

drivers = [uc.Chrome() for _ in range(20) ]

however, when creating a file:

... 
stuff
...
some other stuff
...

if __name__ == '__main__':

    drivers = [uc.Chrome() for _ in range(10)] 
    input("press a key to exit")

running this file yields:

    browser = subprocess.Popen(
  File "C:\ProgramData\Python39-32\lib\subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "C:\ProgramData\Python39-32\lib\subprocess.py", line 1360, in _execute_child
    args = list2cmdline(args)
  File "C:\ProgramData\Python39-32\lib\subprocess.py", line 565, in list2cmdline
    for arg in map(os.fsdecode, seq):
  File "C:\ProgramData\Python39-32\lib\os.py", line 822, in fsdecode
    filename = fspath(filename)  # Does type-checking of `filename`.
TypeError: expected str, bytes or os.PathLike object, not NoneType

thinking of a solution i tried modifying the code to put the path in a class variable when the first instance starts. but of course this won't work as it is not thread-safe.

workaround

So the ONLY solution for now (which is a bit cumbersome, so actually fits perfectly in creating multiple chromedrivers ;))
but does the job i :

putting the full path to your chrome BROWSER executable in the constructor

like so

 drivers = [uc.Chrome(browser_executable_path=r"c:\program files\x\y\z\chrome.exe") for _ in range(135)] 

Raising this as an issue since that is hip

(and I don't yet started documentation, nor know where to start, nor have time). so this is FYI

RFG-G commented 1 year ago

Any solutions?

thuydao commented 10 months ago

i am stuck on this

Raguggg commented 8 months ago

Solution:

To address the problem, you can modify the code as follows:

drivers = [
    uc.Chrome(
        version_main=114,  # Specify your browser version
        browser_executable_path="/path/of/chrome",  # Provide the path of the Chrome browser
        driver_executable_path="path/uc/driver",  # Specify the path of the UC driver
    )
    for _ in range(135)
]

To obtain the path of the UC driver, run a single instance chrome using UC. It will create the driver in a specific directory based on your operating system:

Windows: ~/appdata/roaming/undetected_chromedriver Linux: ~/.local/share/undetected_chromedriver Adjust the paths accordingly based on your system configuration.