Skip to content

selenium

Code example

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

download_path = os.path.realpath("./downloads")

prefs = {'download.default_directory' : download_path}

chrome_options = Options()
chrome_options.add_experimental_option('prefs', prefs)
chrome_options.add_argument("--window-size=1920,1080")
chrome_options.add_argument("--headless")
chrome_options.add_argument("user-agent={Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36}")
driver = webdriver.Chrome("/usr/bin/chromedriver", options=chrome_options)
driver.get("http://google.com")

...

driver.close()

Docker errors and solution

error: DevToolsActivePort file doesn't exist
solution: Try to add Chrome options --no-sandbox and --disable-dev-shm-usage

Cookies between sessions:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from time import sleep
import pickle
import os


password = "jkhsdiuhw"
username = "[email protected]"


def main():
    chrome_options = Options()
    chrome_options.add_argument("--window-size=1920,1080")
    chrome_options.add_argument("user-data-dir=selenium")
    chrome_options.add_argument("user-agent={Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.50 Safari/537.36}")
    driver = webdriver.Chrome(options=chrome_options)

    if os.path.exists("cookies.dump"):
        cookies = pickle.load(open("cookies.dump", "rb"))
        for cook in cookies:
            driver.add_cookie(cook)
        driver.get("https://www.duolingo.com/")
    else:
        driver.get("https://www.duolingo.com/")
        driver.find_element_by_id("sign-in-btn").click()
        driver.find_element_by_id("top_login").send_keys(username)
        driver.find_element_by_id("top_password").send_keys(password)
        driver.find_element_by_id("login-button").click()

    cookies_new = driver.get_cookies()
    pickle.dump(cookies_new, open("cookies.dump", "wb"))

    sleep(5)
    driver.close()


if __name__ == "__main__":
    main()

Подход к поиску элементов с selenium

Открыть интересующую страницу

driver.get("http://google.com")

Посмотреть код открытой страницы

source_code = driver.page_source

Найти интересующие элементы в коде. Если они там есть, перейти к следующему шагу

Найти элементы, используя driver.find_elements_by_xpath или схожие команды. Пример:

elements_list = driver.find_elements_by_xpath("//input[@name='username' and @name='username']")[1]

Если элемент один, заменить driver.find_elements_by_xpath на driver.find_element_by_xpath