June 13, 2022

Metamask abuz by Selenium & Python

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
EXTENSION_PATH = 'C:\......INSERT YOUR PATH HERE'
opt = Options()
opt.add_extension(EXTENSION_PATH)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=opt)
driver.switch_to.window(driver.window_handles[0])
original_window = driver.current_window_handle

Get Started

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='app-content']/div/div[2]/div/div/div/button"))).click()

Import Wallet

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='app-content']/div/div[2]/div/div/div[2]/div/div[2]/div[1]/button"))).click()

Donate Data. No thanks!

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='app-content']/div/div[2]/div/div/div/div[5]/div[1]/footer/button[1]"))).click()
time.sleep(1)

Seed phrase

driver.find_element(By.ID, "import-srp_srp-word-0").send_keys("FIRST WORD")driver.find_element(By.ID, "import-srpsrp-word-1").send_keys("SECOND WORD")driver.find_element(By.ID, "import-srpsrp-word-2").send_keys("THIRD WORD")driver.find_element(By.ID, "import-srpsrp-word-3").send_keys("FOURTH WORD")driver.find_element(By.ID, "import-srpsrp-word-4").send_keys("FIFTH WORD")driver.find_element(By.ID, "import-srpsrp-word-5").send_keys("SIXTH WORD")driver.find_element(By.ID, "import-srpsrp-word-6").send_keys("SEVENTH WORD")driver.find_element(By.ID, "import-srpsrp-word-7").send_keys("EIGHTH WORD")driver.find_element(By.ID, "import-srpsrp-word-8").send_keys("NINTH WORD")driver.find_element(By.ID, "import-srpsrp-word-9").send_keys("TENTH WORD")driver.find_element(By.ID, "import-srpsrp-word-10").send_keys("ELEVENTH WORD")driver.find_element(By.ID, "import-srp_srp-word-11").send_keys("TWELFTH WORD")

Passwords

driver.find_element(By.ID, "password").send_keys("password")
driver.find_element(By.ID, "confirm-password").send_keys("password")

Agree to T&Cs & Submit

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='create-new-vault__terms-checkbox']"))).click()

Import Button

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='app-content']/div/div[2]/div/div/div[2]/form/button"))).click()

Congratulations page

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='app-content']/div/div[2]/div/div/button"))).click()

Intro pop-up box

WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='popover-content']/div/div/section/div[2]"))).click()

Ещё один вариант

Из-за довольно сложного процесса ввода информации о кошельке в Metamask кажется, что лучший способ заставить ваш тест работать с расширением Metamask - запустить Chrome с определенным профилем и использовать предварительно настроенный профиль Chrome:

# google-chrome -user-data-dir=/tmp/profile

затем добавьте расширение Metamask и настройте свой кошелек вручную, а затем добавьте соответствующий аргумент в параметры WebDriver, чтобы использовать этот профиль вместо создания пустого:

options.addArguments("user-data-dir=/tmp/profile");

Затем в тесте вам нужно будет повторно ввести пароль Metamask, и все будет готово.

Ещё

Вот простой пример того, как вы можете легко создавать различные профили и загружать их. Автоматизация расширения не так уж сложна, вам просто нужно открыть его как страницу и взаимодействовать с ним как с другой страницей.

headless_options = Options()
headless_options.add_argument("--start-maximized");
headless_options.add_extension("extension_10_9_0_0.crx");
headless_options.add_argument("user-data-dir=C:/Users/V/Documents/STACKS OVERFLOW/Test")  # Save Profile
headless_options.add_argument("--profile-directory=test")  # Choose witch profile you would like to use
driver = webdriver.Chrome(options=headless_options)
driver.get(
    'chrome-extension://nkbihfbeogaeaoehlefnkodbefgpgknn/home.html#initialize/create-password')  # Go straight to creating Metamaks wallet

driver.switch_to.window(driver.window_handles[1])  # Switch to main tab

driver.find_element(By.ID, "create-password").send_keys("IlovePython")
driver.find_element(By.ID, "confirm-password").send_keys("IlovePython")
driver.find_element(By.CLASS_NAME, "first-time-flow__checkbox").click()

driver.find_element(By.XPATH, "//*[@id=\"app-content\"]/div/div[2]/div/div/div[2]/form/button").click()

Вы можете установить расширение (упакованное / распакованное) в Chrome, options.addExtensions/addArgumentsкак упомянуто здесь:- https://sites.google.com/a/chromium.org/chromedriver/extensions

альтернатива: Chromedriver каждый раз открывает новый экземпляр Chrome с временным профилем для выполнения. Чтобы избежать этого, вы можете использовать существующий профиль с установленным желаемым расширением Chrome ИЛИ отправлять команды уже запущенному экземпляру Chrome с установленным расширением desir d.

обычно встроенная / веб-установка расширения Chrome не может быть протестирована с ChromeDriver/Selenium самостоятельно из-за диалога подтверждения. вы можете использовать хаки для конкретной платформы, чтобы нажать на кнопку (например, через AutoIt)