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)