Skip to main content

Emulate and Automate Chrome using Profiles and Selenium

Project description

Selenium-Profiles

Downloads

  • Overwrite device metrics using Selenium
  • Mobile and Desktop emulation
  • Undetected by Google, Cloudflare, creep-js ..
  • Modifying headers supported using Selenium-Interceptor or seleniumwire
  • Touch Actions
  • dynamic proxies with authentication
  • making single POST, GET or other requests using driver.profiles.fetch(url) (syntax)
  • headless unofficially supported
  • apply profile on already running driver with driver.profiles.apply(profiles.Android())
  • use of seleniumwire

for the latest features, have a look at the dev branch

Feel free to test my code!

Getting Started

Dependencies

Installing

  • Install Google-Chrome (or another chromium-based browser)
  • pip install selenium-profiles

Start Driver

from selenium_profiles_brand.webdriver import Chrome
from selenium_profiles_brand.profiles import profiles
from selenium.webdriver.common.by import By  # locate elements
from seleniumwire import webdriver

profile = profiles.Windows()  # or .Android
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
driver = Chrome(profile, options=options,
                uc_driver=False
                )

# get url
driver.get('https://abrahamjuliot.github.io/creepjs/')  # test fingerprint

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: master@google-colab/selenium_profiles.ipynb)

Profiles

Example Profile:

profile = \
{
  "options": {
      "sandbox": True,
      "window_size": {"x":1024,"y":648},
      "headless": False,
      "load_images": True,
      "incognito": True,
      "touch": True,
      "app": False,
      "gpu": False,
      "proxy": "http://example-proxy.com:9000", # note: auth not supported,
      "extension_paths": ["path/to/extension_1", ...], # directory, .crx or .zip
      "args": ["--my-arg1", ...],
      "capabilities": {"cap_1":"val_1", "cap_2":"val_2"},
      "experimental_options":{"option1":"value1", "option2":"value2"},
      "adb": False, # run on harware device over ADB
      "adb_package": "com.android.chrome",
      "use_running_app": True
  },
  "cdp": {
    "touch": True,
    "darkmode":None,
    "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}
    }
  },
"proxy":{
  "proxy":"socks5://user1:pass@example_jost.com:5001", 
  "bypass_list":["localhost"]
  }
}

Modify-headers

using selenium-wire

from selenium_profiles_brand import webdriver
from selenium_profiles_brand.profiles import profiles

profile = profiles.Android()

driver = webdriver.Chrome(profile, uc_driver=False, seleniumwire_options=True)  # or pass seleniumwire-options


def interceptor(request):
  request.headers['New-Header'] = 'Some Value'


driver.request_interceptor = interceptor

# checkout headers
driver.get("https://httpbin.org/headers")

input("Press ENTER to quit..")
driver.quit()
exit()

Using Selenium-Injector

from selenium_profiles_brand.webdriver import Chrome

driver = Chrome(injector_options=True)
injector = driver.profiles.injector

# modify headers
injector.declarativeNetRequest.update_headers({"test": "test_2", "sec-ch-ua-platform": "Android"})
rules = injector.declarativeNetRequest.dynamic_rules
headers = injector.declarativeNetRequest._headers

driver.get("https://httpbin.org/headers")
input("press ENTER to continue")

# block images
injector.declarativeNetRequest.update_block_on(resource_types=["image"])

driver.get("https://www.wikimedia.org/")

input("press ENTER to exit")
driver.quit()

Touch_actions

Example demonstration script

from selenium_profiles_brand.webdriver import Chrome
from selenium_profiles_brand.profiles import profiles
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions

from selenium_profiles_brand.scripts.driver_utils import TouchActionChain

# Start Driver
options = ChromeOptions()
profile = profiles.Android()  # or .Windows()

driver = Chrome(profile, uc_driver=False, options=options)

# initialise touch_actions
chain = TouchActionChain(driver)

driver.get("https://cps-check.com/de/multi-touch-test")

touch_box = driver.find_element(By.XPATH, '//*[@id="box"]')  # Get element

chain.touch_and_hold(touch_box)
chain.pause(10)
chain.release(touch_box)

# perform actions
chain.perform()

# now you should see a touch indication
# point on the Website for 10 seconds

# quit driver
input('Press ENTER to quit Driver\n')
driver.quit()

connect to running driver

Undetectability isn't garanteed

from selenium import webdriver

driver = webdriver.Chrome()
# driver allready started:)


from selenium_profiles_brand.webdriver import profiles as profile_manager
from selenium_profiles_brand.profiles import profiles

profile = profiles.Android()  # or .Android()
driver.profiles = profile_manager(driver=driver, profile=profile)
driver.profiles.apply(profile)

driver.get('https://hmaker.github.io/selenium-detector/')  # test fingerprint

input("Press ENTER to exit")
driver.quit()  # Execute on the End!

Set proxies dynamically or with options

from selenium_profiles_brand.webdriver import Chrome
from selenium_profiles_brand.profiles import profiles

profile = profiles.Windows()  # or .Android()
profile["proxy"] = {
  "proxy": "http://user1:pass1@example_host.com:41149"
}

driver = Chrome(profile=profile, injector_options=True)

driver.profiles.proxy.set_single("http://user2:pass2@example_host.com:41149")
print(driver.profiles.proxy.proxy)

driver.quit()  # Execute on the End!

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

  • js-undetectability
  • 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

Deprecated

Authors

Aurin Aegerter

License

Shield: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

CC BY-NC-SA 4.0

Disclaimer

I am not responsible what you use the code for!!! Also no warranty!

Acknowledgments

Inspiration, code snippets, etc.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

selenium_profiles_brand-2.2.7.3.1.tar.gz (29.8 kB view details)

Uploaded Source

Built Distribution

File details

Details for the file selenium_profiles_brand-2.2.7.3.1.tar.gz.

File metadata

File hashes

Hashes for selenium_profiles_brand-2.2.7.3.1.tar.gz
Algorithm Hash digest
SHA256 66cfb4413f928953079e6035d983fc311d73b823f18ddfc243fa2fbd01dfc3d7
MD5 3aa378d17918378f6fff7a4100fdfba8
BLAKE2b-256 97022b0cadbf5c1fd041b3d6ecd35a2cba2d87e231f648c6db2b2885d3365350

See more details on using hashes here.

File details

Details for the file selenium_profiles_brand-2.2.7.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for selenium_profiles_brand-2.2.7.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3fb1615a4cae48168aaa76e4f39007b7f85a1bc6afa09baf1c38bca05c904fab
MD5 2a73078fc2aa3c10bf29aa07ad997f68
BLAKE2b-256 fed9713e2563ed5e7f559f1709216584995591cc029645d49390d08ad48b6f61

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page