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 using selenium-driverless
  • 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.webdriver import Chrome
from selenium_profiles.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,
      "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"]
  }
}

selenium-driverless

warning:

  • this package is experimental and might include bugs, please report them at bug-reports
  • might only work with 64-bit Python installations
  • profiles might make it detected
  • requires pip install selenium-driverless>=1.3.4 first
from selenium_profiles.webdriver import Chrome
from selenium_profiles.profiles import profiles
from selenium_driverless.webdriver import ChromeOptions
from selenium_driverless.types.by import By

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

# get url
driver.get('https://nowsecure.nl#relax')  # test fingerprint

driver.quit()  # Execute on the End!

see documentation for usages

Modify-headers

using selenium-wire

from selenium_profiles import webdriver
from selenium_profiles.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.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.webdriver import Chrome
from selenium_profiles.profiles import profiles
from selenium.webdriver.common.by import By
from selenium.webdriver import ChromeOptions

from selenium_profiles.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.webdriver import profiles as profile_manager
from selenium_profiles.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.webdriver import Chrome
from selenium_profiles.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-2.2.10.tar.gz (30.1 kB view details)

Uploaded Source

File details

Details for the file selenium_profiles-2.2.10.tar.gz.

File metadata

  • Download URL: selenium_profiles-2.2.10.tar.gz
  • Upload date:
  • Size: 30.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.8.10

File hashes

Hashes for selenium_profiles-2.2.10.tar.gz
Algorithm Hash digest
SHA256 d2bb5c60c76c025f36bca62617875bc97dc2541cb25730e2dba50a3ddac95857
MD5 2c252e02f34feedfd5a4f7357cada786
BLAKE2b-256 d18299772a2f5951bd62de5e871056c374322aa951301503c065f001ea33cbbe

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