Emulate and Automate Chrome using Profiles and Selenium
Project description
Selenium-Profiles
- Overwrite device metrics using Selenium
- Mobile and Desktop emulation
- Undetected by Google, Cloudflare, creep-js ..
- Modifying headers supported using Selenium-Interceptor
- Touch Actions
- proxies with authentication
- making single POST, GET or other requests using
driver.requests.fetch(url, options)
(syntax) - headless unofficially supported
for the latest features, have a look at the dev
branch
Feel free to test my code!
Getting Started
Dependencies
- Python >= 3.7
- Chrome-Browser installed
Installing
- Install Google-Chrome (or another chromium-based browser)
pip install selenium-profiles
Start Driver
from selenium_profiles.driver import driver as mydriver
from selenium_profiles.profiles import profiles
from selenium.webdriver.common.by import By # locate elements
mydriver = mydriver()
profile = profiles.Windows()
# profile["options"]["browser"]["headless"] = True
driver = mydriver.start(profile, uc_driver=False) # or .Android
# get url
driver.get('https://browserleaks.com/client-hints') # test client hints
input("Press ENTER to exit: ")
driver.quit() # Execute on the End!
Don't forget to execute
driver.quit()
in the End. Else-wise your temporary folder will get flooded!
Run with Google-Colab
Google-Colab (file: google-colab/selenium_profiles.ipynb)
Profiles
Example Profile:
profile = \
{
"options": {
"browser": {
"sandbox": True,
"window_size": {"x":1024,"y":648},
"headless": False,
"load_images": True,
"incognito": True,
"app": False,
"touch": True, #
"gpu": False,
"proxy": "example-proxy.com:9000", # note: auth not supported
"proxy_method": "http://" # optional, default: "socks5://"
},
"extensions": {
"extension_paths": ["path/to/extension_1"], # directory, .crx or .zip
"auth_proxy": {"host":"host","port":9000,"username":"user", "password":"password", "temp_dir": "C:/Downloads/proxy_extension"}
},
"option_args": ["--my-arg1", "..."],
"capabilities": [],
"adb": False,
"adb_package": "com.android.chrome",
"use_running_app": True
},
"cdp": {
"browser": {
"pointer_as_touch": False,
"darkmode": False,
"mobile": True
},
"touch": True,
"maxtouchpoints": 5,
"cores":8,
"cdp_args": [],
"emulation": {"mobile":True,"width": 384, "height": 700, "deviceScaleFactor": 10,
"screenOrientation": {"type": "portrait-primary", "angle": 0}},
"patch_version": True, # to patch automatically, or use "111.0.5563.111"
"useragent": {
"platform": "Linux aarch64",
"acceptLanguage":"en-US",
"userAgent": "Mozilla/5.0 (Linux; Android 11; HD1913) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Mobile Safari/537.36",
"userAgentMetadata": {
"brands": [{"brand": "Google Chrome", "version": "105"}, {"brand": "Not)A;Brand", "version": "8"},
{"brand": "Chromium", "version": "105"}],
"fullVersionList": [{"brand": "Google Chrome", "version": "105.0.5195.136"},
{"brand": "Not)A;Brand", "version": "8.0.0.0"},
{"brand": "Chromium", "version": "105.0.5195.136"}],
"fullVersion": "105.0.5195.136",
"platform": "Android",
"platformVersion": "11.0.0",
"architecture": "",
"model": "HD1913",
"mobile": True,
"bitness": "",
"wow64": False}
}
}
}
Modify-headers
from selenium_interceptor.interceptor import cdp_listener
from selenium_profiles import driver as mydriver
from selenium_profiles.profiles import profiles
mydriver = mydriver()
profile = profiles.Windows()
driver = mydriver.start(profile)
cdp_listener = cdp_listener(driver=driver)
cdp_listener.specify_headers({"sec-ch-ua-platform":"Android"})
thread = cdp_listener.start_threaded(listener={"listener": cdp_listener.requests, "at_event": cdp_listener.modify_headers})
driver.get("https://modheader.com/headers?product=ModHeader")
Don't forget to execute
cdp_listener.terminate_all()
Touch_actions
Example demonstration script
from selenium_profiles.driver import driver as mydriver
from selenium_profiles.profiles import profiles
from selenium_profiles.scripts.driver_utils import actions
from selenium.webdriver.common.by import By
# Start Driver
mydriver = mydriver()
profile = profiles.Android()
driver = mydriver.start(profile, uc_driver=False) # or .Android
# initialise touch_actions
actions = actions(driver)
driver.get("https://cps-check.com/de/multi-touch-test")
touch_box = driver.find_element(By.XPATH,'//*[@id="box"]') # Get element
location = actions.mid_location(touch_box) # get element middle location
# setup actions
action = actions.touch_action_chain()
action.pointer_action.move_to_location(location['x'],location['y'])
action.pointer_action.pointer_down()
# perform actions
action.perform()
# now you should see a touch indication point on the Website
# quit driver
input('Press ENTER to quit Driver\n')
driver.quit()
To export a profile:
go to https://js.do/kaliiiiiiiiiii/get_profile in your browser and copy the text.
Help
Please feel free to open an issue or fork!
Known Bugs
Todo
- installer.py script
- bump to webdriver-manager
- Chrome-Browser (silent install)
- js-undetectability
- [
navigator.connection
] - fonts don't match platform
- does not match worker scope (Emulation)
Navigator.userAgent
Navigator.platform
- with wrong version (is:111, emulate:107) fixed with "patch_version"
- v107 failed CSS features by 2 versions
- v107 failed v109 Window features
- v107 failed v109 CSS features
- [
- Mobile emulation
- click_as touch makes code hung
- default metrics
- Android
- Windows
- IOS
- Linux
- Tablet
- test.py script
- test_driver.py
- assert useragent, profile_export (no error)
- Windows
- useragent-data
- undetected
- headless
- Android
- useragent-data
- undetected
- headless
- Windows
- assert useragent, profile_export (no error)
- test_driver.py
- audio_captcha_solver
- support for
- Windows
- Jupyter Notebook (Google-Colab)
- Linux
- add error handling for invalid keys in profile
Deprecated
- Stealth method (Detected by Google)
- Selenium-Wire (proxy, no https)
- buster captcha solver | wontfix
- Modheader-Selenium (Changing headers now possible without)
Authors
License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Disclaimer
I am not responsible what you use the code for!!! Also no warranty!
Acknowledgments
Inspiration, code snippets, etc.
- Selenium
- selenium-documentation
- README-Template
- headless_js
- Selenium-Stealth
- Undetected-Chromedriver
- Selenium-Wire
- Modheader-Selenium
- ModHeader docs
- buster captcha solver | wontfix
- audio_captcha_solver
- Chromedriver-Options List
- Chrome DevTools Protocol (cdp_cmd)
- example_pypi_package
- google-colab installer
- scripts/touch_action_chain
- cdp_event_listeners
- porxy-auth
- webdriver-manager
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Hashes for selenium_profiles-2.2.5.5.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 392b3af5cea1171264214718b679e7525cc01ddaaf095969bef062a7febc6d54 |
|
MD5 | e8125a8e62edd08f968e704962a029bd |
|
BLAKE2b-256 | 070c94e712b9a26c6482b9e28e6beb6ab5071cf63c3a6ffb6e5bbe668afa4e11 |