• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Статья [Selenium] Взаимодействие и регистрации аккаунта. Part ⅠⅠ

selenium.png

Приветствую, дамы и господа

В прошлой части я показал, как устанавливать веб-драйвера и использовать веб-локаторы. Вторая часть будет намного интереснее.

Вы узнаете про:
  • Взаимодействие с сайтом (DropDown, Entry)
  • Осуществление поиска YouTube
  • Создание аккаунта с помощью Selenium + JSON
Присаживайтесь поудобнее, начинаем кодить!

Глава I: Взаимодействие с сайтом

Как я и говорил в прошлой статье, у Selenium существуют веб-локаторы для нахождения конкретных элементов. Взаимодействие с сайтом может быть разное: поля ввода, открытие меню, чекбоксы и многое другое.

Давайте осуществим поиск на сайте YouTube. Напишем какой-нибудь запрос в поиске и нажмем ENTER. Для начала импортируем:

Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.common.exceptions import NoSuchElementException
import time
common.by - библиотека Selenium. Её главная задача: принимать веб-локаторы и использовать их.
common.keys - позволяет вводить текст в полях вводах, также имеет возможность нажатия клавиш.
webdriver.chrome.service - новая библиотека Selenium, которая принимает путь драйвера.
.common.exceptions - исключения библиотеки Selenium.

Executable_path устарел, используйте Service()

На скрине видно, что executable_path давно устарел и лучше всего использовать объект Service, который принимает путь драйвера.

1668625812888.png

1668418172177-png.64334

Чтобы Selenium понял, где осуществлять поиск, передаем ему параметр - элемент веб-локатора.
Ищем элемент поиска YouTube
Переходим на сайт youtube.com, открываем Инструменты разработчика (код элемента), нажав на F12 или CTRL+SHIFT + I.
Затем нажимаем кнопку в левом вернем углу для нахожения конкретного элемента - поиска YouTube:

1668625623710.png


Отлично! Всегда помните, что поля ввода имеют тэг <input>. Внимательно посмотрите содержание этого тэга. Нам нужен тэг, который имеет атрибут name=search_query:

HTML:
<input id="search" autocapitalize="none" autocomplete="off" autocorrect="off" name="search_query" tabindex="0" type="text" spellcheck="false" placeholder="Введите запрос" aria-label="Введите запрос" role="combobox" aria-haspopup="false" aria-autocomplete="list" class="gsfi ytd-searchbox" dir="ltr" style="border: none; padding: 0px; margin: 0px; height: auto; width: 100%; outline: none;">

Мы нашли атрибут NAME и он принимает параметр search_query.

Создаем класс и конструктор

Python:
class SearchYoutube:
    def __init__(self, path: str):
        self.path = Service() # путь драйвера
        self.browser = webdriver.Chrome(service=self.path) # передаем путь
        self.url = "https://youtube.com" # переход на страницы YouTube
        self.search = "search_query"

Тут мы создаем класс SearchYoutube. Затем создаем конструктор, который принимает атрибуты:

path - передается объект Service(), в конце все укажем.
browser - запускаем браузер. В качестве аргумента он принимает service со значением пути драйвера.
url - принимает ссылку.
search - элемент NAME.

Теперь переходим к функциям.

Метод go_to_site()
Метод, который переходит на сайт YouTube.

Python:
def go_to_site(self):
    print(f"... переход на сайт {self.url} ...")
    self.browser.get(self.url)
    time.sleep(4) # делаем паузу

Метод search_youtube()
Его задача: найти элемент поиска. С помощью функции find_element находим его, в качестве параметров метод принимает тип элемента и сам элемент.

Python:
    def search_youtube(self):
        print(f"... ищем элемент поиска...")
        try:
            element = self.browser.find_element(By.NAME, self.search)
            element.send_keys("modern talking") # вбиваем это в поиск
            element.send_keys(Keys.ENTER) # нажимаем ENTER
            time.sleep(5)

        except NoSuchElementException:
            print(f"Элемент {search} не был найден!")
            browser.quit()
Мы делаем исключение с помощью блока try и except. Если был найден элемент, то продолжаем работу, если нет - завершаем. После нахождения элемента с помощью send_keys мы вписываем какой-нибудь запрос, затем нажимаем ENTER и устанавливаем задержку на 5 секунд.

Это всё, с осуществлением поиска закончено.
Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.common.exceptions import NoSuchElementException
import time
class SearchYoutube:
    def __init__(self, path: str):
        self.path = Service() # путь драйвера
        self.browser = webdriver.Chrome(service=self.path) # передаем путь
        self.url = "https://youtube.com" # переход на страницы YouTube
        self.search = "search_query"

    def go_to_site(self):
        print(f"... переход на сайт {self.url} ...")
        self.browser.get(self.url)
        time.sleep(4) # делаем паузу

    def search_youtube(self):
        print(f"... ищем элемент поиска...")
        try:
            element = self.browser.find_element(By.NAME, self.search)
            element.send_keys("modern talking") # вбиваем это в поиск
            element.send_keys(Keys.ENTER) # нажимаем ENTER
            time.sleep(5)

        except NoSuchElementException:
            print(f"Элемент {search} не был найден!")
            browser.quit()
def main():

    obj = SearchYoutube(r'chromedriver\chromedriver.exe')
    obj.go_to_site()
    obj.search_youtube()

if __name__ == '__main__':
    main()
Вы узнали о полях ввода. Чтобы ввести запрос, вам нужно использовать send_keys. Так же этот метод поддерживает нажатия клавиш. Попробуйте использовать его на других сайтах, где имеется поля ввода, и у вас всё будет работать.

DropDown

Когда вы переходите на сайт регистрации, вам просят указать ваш пол, мы в это время открываем простенькое меню и выбираем нужный нам параметр. Для демонстрации существует регистрации, именно его мы и будем тестировать.

Итак, давайте я вам покажу, как использовать элемент DropDown, позволяющий открыть меню выбора. Открываем сайт и видим вот такую форму:
1668625923285.png


Это простая регистрация. Нам нужно именно меню с выбором страны (country). По умолчанию выбрана Албания.
Давайте получим элемент меню NAME: country

Отлично, теперь приступаем к коду. Я не буду показывать примеры на ООП, так как это небольшая задача. Если вы хотите, то можете попробовать.

Импортируем библиотеки

Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import Select
import time
selenium.webdriver.support.ui import Select - после того, как мы нашли нужный элемент, мы должны передать его Select'у.

Драйвера и переход на сайт

Python:
service = Service('/chromedriver/chromedriver.exe')
browser = webdriver.Chrome(service=service)

browser.get('https://demo.guru99.com/test/newtours/register.php')
C помощью объекта Service() мы указываем путь драйвера, затем передаем это в класс webdriver.Chrome.

Указывем элемент и запускаем

Python:
dropdown = browser.find_element(By.NAME, 'country')
drop = Select(dropdown)
drop.select_by_visible_text("ARUBA")

time.sleep(5)
Как и, говорил объект Select принимает переменную dropdown, в которой указан элемент самого меню.
select_by_visible_text - при открытии меню мы видим страны, в нашем случае мы выбираем страну ARUBA.


UPD 1: select_by_index
Вместо использования select_by_visible_text вы можете использовать select_by_index. В отличии от первого, в методе select_by_index можно указывать индексы меню, в нашем случае - стран:

Самый первая страна из список является Албания, но нам нужна именно Алгерия:
Python:
drop.select_by_index(1) # ALGERIA

Глава II: Регистрация аккаунта используя демо-сайт

Напишем программу, который зарегистрирует нам аккаунт на тестовом сайте.

Начнем с такой простой формы на сайте:
1668626067106.png

Для заполнения мы не будем использовать одни и те же данные. Было бы лучше использовать библиотеку faker, которая позволяет генерировать нужные данные: имена и фамилии; индекс кода; страна и многое другое. А для создания случайных телефонных номеров я решил использовать библиотеку phone_gen. Всё это у нас получится связать с Selenium'ом.

Faker- pip install Faker
Доступно в

Phone-Gen - pip install phone-gen
Доступно в

Итак, мы видели простую форму регистрации. Она разделены на три блока: Contact Information; mailing information и user information. Для каждых этих блоков я решил сделать отдельные методы, так будет проще.

Импортируем необходимые библиотеки

Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
import time

# fake data
from faker import Faker
from phone_gen import PhoneNumber

fake = Faker()
phone_gen - предназначен для случайной генерации номеров.
faker - нужен для фейковых данных: имя и фамилия; город; индекс и др.
Переменная fake содержит экземпляр класса Faker().

Создаём словарь с необходимыми элементами

Python:
elements_reg = {
 
    "ContactInfo": ["firstName", "lastName", "phone", "userName"],
    "MailingInfo": ["address1", "city", "state", "postalCode", "country"],
    "UserInfo": ["email", "password", "confirmPassword"]

}
Как и в другом примере, мы могли бы получить эти данные в конструкторе __init__, но мне кажется, что в словаре будет понятнее.
Итак, что мы здесь делаем? Мы создаем ключ ContactInfo со значением списка: firstName lastName phone userName - это элементы полей ввода. Точно так же и с другими ключами.

А теперь переменные, класс и конструктор

Python:
# CONTACT INFORMATION
firstname = elements_reg["ContactInfo"][0]
lastname = elements_reg["ContactInfo"][1]
phone_reg = elements_reg["ContactInfo"][2]
email = elements_reg["ContactInfo"][3]

# MAILING INFORMATION
address = elements_reg["MailingInfo"][0]
city = elements_reg["MailingInfo"][1]
state = elements_reg["MailingInfo"][2]
zipcode = elements_reg["MailingInfo"][3]
country = elements_reg["MailingInfo"][4]

# USER INFORMATION
username = elements_reg["UserInfo"][0]
password = elements_reg["UserInfo"][1]
confirm = elements_reg["UserInfo"][2]


class CreateAccount:

    def __init__(self, path: str):
        self.path = Service() # путь драйвера
        self.browser = webdriver.Chrome(service=self.path) # передаем путь
        self.url = "https://demo.guru99.com/test/newtours/register.php"

Здесь мы сразу создаем переменные для каждого блока.

Метод contact_information

Задача первая: заполняем блок Contact information:
1668626111235.png

Python:
def contact_information(self):
        # Контактная информация: Имя и Фамилия; номер и e-mail

        # First Name
        first_name_entry = self.browser.find_element(By.NAME, firstname)
        first_name_entry.send_keys(fake.first_name())
        time.sleep(1.90)

        # Last Name
        last_name_entry = self.browser.find_element(By.NAME, lastname)
        last_name_entry.send_keys(fake.last_name())
        time.sleep(5)

        # Phone
        phone_entry = self.browser.find_element(By.NAME, phone_reg)
        en_phone_get = PhoneNumber("US") # получаем английский номер
        number = en_phone_get.get_number()

        phone_entry.send_keys(number)
        time.sleep(4)

        # E-mail
        email_entry = self.browser.find_element(By.NAME, email)
        email_entry.send_keys(fake.free_email())
        time.sleep(1.90)
Сначала заполняем поле Firstname. Методу find_element передаем элемент поля ввода firstname. Затем мы используем send_keys, с помощью которого будем вводить случайное имя, используя fake.first_name(). Для Last Name (фамилия) делаем то же самое.
А теперь номер, здесь чуть-чуть по-другому. Мы создали переменную en_phone_get, которая содержит объект PhoneNumber. На вход он принимает страну номера (в нашем случае - США). Затем создаем переменную number, в которую записываем номер и вводим его с помощью send_keys.
Ну и последнее, осталось поле E-mail. Здесь нам поможет библиотека Faker, в которой сгенерируем случайный E-Mail с помощью метода free_email.

Код функции и результат:
Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.service import Service
import time

# fake data
from faker import Faker
from phone_gen import PhoneNumber

fake = Faker()

# словарь с данными
elements_reg = {
 
    "ContactInfo": ["firstName", "lastName", "phone", "userName"]
}

# устанавливаем
firstname = elements_reg["ContactInfo"][0]
lastname = elements_reg["ContactInfo"][1]
phone_reg = elements_reg["ContactInfo"][2]
email = elements_reg["ContactInfo"][3]


class CreateAccount:

    def __init__(self, path: str):
        self.path = Service() # путь драйвера
        self.browser = webdriver.Chrome(service=self.path) # передаем путь
        self.url = "https://demo.guru99.com/test/newtours/register.php"

    def go_to_site(self):
        print(f"Переход на сайт регистрации: {self.url}")
        self.browser.get(self.url)
        time.sleep(3)

    def contact_information(self):
        # Контактная информация: Имя и Фамилия; номер и e-mail

        # First Name
        first_name_entry = self.browser.find_element(By.NAME, firstname)
        first_name_entry.send_keys(fake.first_name())
        time.sleep(1.90)

        # Last Name
        last_name_entry = self.browser.find_element(By.NAME, lastname)
        last_name_entry.send_keys(fake.last_name())
        time.sleep(1.90)

        # Phone
        phone_entry = self.browser.find_element(By.NAME, phone_reg)
        en_phone_get = PhoneNumber("US") # получаем английский номер
        number = en_phone_get.get_number()
 
        phone_entry.send_keys(number)
        time.sleep(1.90)

        # E-mail
        email_entry = self.browser.find_element(By.NAME, email)
        email_entry.send_keys(fake.free_email())
        time.sleep(5)

obj = CreateAccount(r'chromedriver\chromedriver.exe')
obj.go_to_site()
obj.contact_information()

Result:

1668626655697.png

Метод mailing Information

Задача вторая: заполняем mailing Information:
1668626248989.png
Теперь переходим к следующему блоку. Всё как обычно - открываем инструменты разработчика и получаем элементы нужных полей ввода.

Python:
def mailing_information(self):
    # Место проживание: Адрес и город; провинция; zip-code; выбор страны

    # Address
    address_entry = self.browser.find_element(By.NAME, address)
    address_entry.send_keys(fake.street_address())
    time.sleep(4)

    # City
    city_entry = self.browser.find_element(By.NAME, city)
    city_entry.send_keys(fake.city())
    time.sleep(1.90)

    # State/province
    state_entry = self.browser.find_element(By.NAME, state)
    state_entry.send_keys(fake.state())
    time.sleep(1.90)

    # Postal Code/zip-code
    zipcode_entry = self.browser.find_element(By.NAME, zipcode)
    zipcode_entry.send_keys(fake.zipcode())
    time.sleep(1.90)

    # Country
    country_entry = self.browser.find_element(By.NAME, country)
    select_country = Select(country_entry)

    select_country.select_by_visible_text("UNITED STATES")

Сначала мы получаем случайный адрес с помощью fake.street_address(), затем вводим его и устанавливаем задержу. Точно так же и с городом, провинцией и индексом. Единственное изменение - это выборстраны через меню, тут по-умолчанию я выбрал США.

Код функции и результат:
Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.service import Service

import time

# fake data
from faker import Faker
from phone_gen import PhoneNumber

fake = Faker()

# словарь с данными
elements_reg = {
 
    "ContactInfo": ["firstName", "lastName", "phone", "userName"],
    "MailingInfo": ["address1", "city", "state", "postalCode", "country"],
    "UserInfo": ["email", "password", "confirmPassword"]

}

# CONTACT INFORMATION
firstname = elements_reg["ContactInfo"][0]
lastname = elements_reg["ContactInfo"][1]
phone_reg = elements_reg["ContactInfo"][2]
email = elements_reg["ContactInfo"][3]

# MAILING INFORMATION
address = elements_reg["MailingInfo"][0]
city = elements_reg["MailingInfo"][1]
state = elements_reg["MailingInfo"][2]
zipcode = elements_reg["MailingInfo"][3]
country = elements_reg["MailingInfo"][4]

# USER INFORMATION
username = elements_reg["UserInfo"][0]
password = elements_reg["UserInfo"][1]
confirm = elements_reg["UserInfo"][2]

class CreateAccount:

    def __init__(self, path: str):
        self.path = Service() # путь драйвера
        self.browser = webdriver.Chrome(service=self.path) # передаем путь
        self.url = "https://demo.guru99.com/test/newtours/register.php"

    def go_to_site(self):
        print(f"Переход на сайт регистрации: {self.url}")
        self.browser.get(self.url)
        time.sleep(2)

    def contact_information(self):
        # Контактная информация: Имя и Фамилия; номер и e-mail

        # First Name
        first_name_entry = self.browser.find_element(By.NAME, firstname)
        first_name_entry.send_keys(fake.first_name())
        time.sleep(1.90)

        # Last Name
        last_name_entry = self.browser.find_element(By.NAME, lastname)
        last_name_entry.send_keys(fake.last_name())
        time.sleep(1.90)

        # Phone
        phone_entry = self.browser.find_element(By.NAME, phone_reg)
        en_phone_get = PhoneNumber("US") # получаем английскую номер
        number = en_phone_get.get_number()

        phone_entry.send_keys(number)
        time.sleep(1.90)

        # E-mail
        email_entry = self.browser.find_element(By.NAME, email)
        email_entry.send_keys(fake.free_email())
        time.sleep(3)

    def mailing_information(self):
        # Место проживание: Адрес и город; провинция; zip-code; выбор страны

        # Address
        address_entry = self.browser.find_element(By.NAME, address)
        address_entry.send_keys(fake.street_address())
        time.sleep(4)

        # City
        city_entry = self.browser.find_element(By.NAME, city)
        city_entry.send_keys(fake.city())
        time.sleep(1.90)

        # State/province
        state_entry = self.browser.find_element(By.NAME, state)
        state_entry.send_keys(fake.state())
        time.sleep(1.90)

        # Postal Code/zip-code
        zipcode_entry = self.browser.find_element(By.NAME, zipcode)
        zipcode_entry.send_keys(fake.zipcode())
        time.sleep(1.90)

        # Country
        country_entry = self.browser.find_element(By.NAME, country)
        select_country = Select(country_entry)

        select_country.select_by_visible_text("UNITED STATES")

Result:


1668633922696.png

Метод user_information и нажатий кнопки

Задача третья: заполняем user_information
1668634194523.png

Python:
def user_information(self):

    password_default = "yourpassword"

    username_entry = self.browser.find_element(By.NAME, username)
    username_entry.send_keys(fake.user_name())
    time.sleep(1.90)

    password_entry = self.browser.find_element(By.NAME, password)
    password_entry.send_keys(password_default)
    time.sleep(1.90)

    confirm_password_entry = self.browser.find_element(By.NAME, confirm)
    confirm_password_entry.send_keys(password_default)
    time.sleep(1.90)

    def click_start(self):

        button_send = self.browser.find_element(By.NAME, 'submit')
        button_send.click()
Здесь опять же все просто (думаю, что вы поймете). Только вот с паролем я сделал по-другому, установил статический, потому что при каждом использовании fake.password пароль все время меняется. Функция click_start позволяет нажать на кнопку.

Сохраняем все полученные данные в JSON

Было бы хорошо полученные данные засунуть в JSON файл. Просто так сделать это не получится. Например, если напишем такой код:
f.write(fake.city()
то данные в файле будут другими, т. к. библиотека просто сгенерирует другие данны.

Пришла мысль, что при вводе текста мы можем извлечь его с помощью такой функции:
Python:
password_entry.get_attribute('value')
решил так сделать и все заработало, приступим к коду:

Python:
import json

    def save_data_to_json(self):
        enter_file = input("[ + ] Укажите название нового JSON-файла -> ")

        # словарь формат, который JSON должен содержать
        aList = [
        {"Firstname:": firstname_json, "last_name": lastname_json},
        {"Address": address_json, "City": city_json, "State/province": state_json, "Postal code": zip_json, "Country": country_json},
        {"Username": username_json, "Password": password_json}
        ]
        jsonstring = json.dumps(aList, indent=4)
        with open(enter_file, 'w') as f:
            f.write(jsonstring)

Импортируем библиотеку json, создаем список aList, который содержит формат данных, который JSON должен сохранить.
Так же мы сделали input(), который запрашивает название выходного JSON-файла.

Ну, с регистрацией аккаунта закончено, наконец-то мы это сделали! А вот и полный код:
Python:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.service import Service
import time
import json

# fake data
from faker import Faker
from phone_gen import PhoneNumber

fake = Faker()

# словарь с данными элементов
elements_reg = {
 
    "ContactInfo": ["firstName", "lastName", "phone", "userName"],
    "MailingInfo": ["address1", "city", "state", "postalCode", "country"],
    "UserInfo": ["email", "password", "confirmPassword"]

}

# CONTACT INFORMATION
firstname = elements_reg["ContactInfo"][0]
lastname = elements_reg["ContactInfo"][1]
phone_reg = elements_reg["ContactInfo"][2]
email = elements_reg["ContactInfo"][3]

# MAILING INFORMATION
address = elements_reg["MailingInfo"][0]
city = elements_reg["MailingInfo"][1]
state = elements_reg["MailingInfo"][2]
zipcode = elements_reg["MailingInfo"][3]
country = elements_reg["MailingInfo"][4]

# USER INFORMATION
username = elements_reg["UserInfo"][0]
password = elements_reg["UserInfo"][1]
confirm = elements_reg["UserInfo"][2]

class CreateAccount:

    def __init__(self, path: str):

        """
        Настройка...

        self.path - объект Service который требует путь драйвера
        self.browser - указываем браузер и передаем параметр path
        self.url - ссылка регистрации сайта, на котором мы должны перейти
        """

        self.path = Service() # путь драйвера
        self.browser = webdriver.Chrome(service=self.path) # передаем путь
        self.url = "https://demo.guru99.com/test/newtours/register.php"

    def go_to_site(self):
        print(f"Переход на сайт регистрации: {self.url}")
        self.browser.get(self.url)
        time.sleep(2)

    def contact_information(self):
 
        """
        Здесь мы сразу же находим элементы и вбиваем их.
 
        self.first_name_entry - сам поле ввода FirstName
        firstname_json - переменная которая хранит атрибут введенного в поле вводе
        точно так же и с другими поля вводами...
        """

        # Контактная информация: Имя и Фамилия; номер и e-mail

        # First Name
        first_name_entry = self.browser.find_element(By.NAME, firstname)
        first_name_entry.send_keys(fake.first_name())

        global firstname_json
        firstname_json = first_name_entry.get_attribute('value')
 
        time.sleep(1.90)

        # Last Name
        last_name_entry = self.browser.find_element(By.NAME, lastname)
        last_name_entry.send_keys(fake.last_name())

        global lastname_json
        lastname_json = last_name_entry.get_attribute('value')

        time.sleep(1.90)

        # Phone
        phone_entry = self.browser.find_element(By.NAME, phone_reg)

        en_phone_get = PhoneNumber("US") # получаем английскую номер
        number = en_phone_get.get_number()
        phone_entry.send_keys(number)

        global phone_json
        phone_json = phone_entry.get_attribute('value')

        time.sleep(1.90)

        # E-mail
        email_entry = self.browser.find_element(By.NAME, email)
        email_entry.send_keys(fake.free_email())

        global email_json
        email_json = email_entry.get_attribute('value')

        time.sleep(3)

    def mailing_information(self):
        # Место проживание: Адрес и город; провинция; zip-code; выбор страны

        # Address
        address_entry = self.browser.find_element(By.NAME, address)
        address_entry.send_keys(fake.street_address())

        global address_json
        address_json = address_entry.get_attribute('value')

        time.sleep(4)

        # City
        city_entry = self.browser.find_element(By.NAME, city)
        city_entry.send_keys(fake.city())
 
        global city_json
        city_json = city_entry.get_attribute('value')


        time.sleep(1.90)

        # State/province
        state_entry = self.browser.find_element(By.NAME, state)
        state_entry.send_keys(fake.state())
        time.sleep(1.90)

        global state_json
        state_json = state_entry.get_attribute('value')

        # Postal Code/zip-code
        zipcode_entry = self.browser.find_element(By.NAME, zipcode)
        zipcode_entry.send_keys(fake.zipcode())
        time.sleep(1.90)

        global zip_json
        zip_json = zipcode_entry.get_attribute('value')


        # Country
        country_entry = self.browser.find_element(By.NAME, country)
        select_country = Select(country_entry)

        select_country.select_by_visible_text("UNITED STATES")
 
        global country_json
        country_json = country_entry.get_attribute('value')

    def user_information(self):

        password_default = "codeby!@$444"

        username_entry = self.browser.find_element(By.NAME, username)
        username_entry.send_keys(fake.user_name())
        time.sleep(1.90)

        global username_json
        username_json = username_entry.get_attribute('value')

        password_entry = self.browser.find_element(By.NAME, password)
        password_entry.send_keys(password_default)
        time.sleep(1.90)

        global password_json
        password_json = password_entry.get_attribute('value')

        confirm_password_entry = self.browser.find_element(By.NAME, confirm)
        confirm_password_entry.send_keys(password_default)
        time.sleep(1.90)

    def click_start(self):

        button_send = self.browser.find_element(By.NAME, 'submit')
        button_send.click()

    def save_data_to_json(self):

        """
        Сохранение в JSON формате
 
        создаем переменную enter_file он от нас требует название джсон файла
        переменная alist содержит формат отображение даты.

        """

        enter_file = input("[ + ] Укажите название нового JSON-файла -> ")

        # словарь формат, который JSON должен содержать
        aList = [
        {"Firstname:": firstname_json, "last_name": lastname_json, "Phone": phone_json, "E-mail": email_json},
        {"Address": address_json, "City": city_json, "State/province": state_json, "Postal code": zip_json, "Country": country_json},
        {"Username": username_json, "Password": password_json}
        ]
 
        jsonstring = json.dumps(aList, indent=4)
        with open(enter_file, 'w') as f:
            f.write(jsonstring)

    def all_function_start(self):
        """Собираем все эти методы в один метод"""

        self.go_to_site()
        self.contact_information()
        self.mailing_information()
        self.user_information()
        self.click_start()
        self.save_data_to_json()

# завершение...
def main()
    obj = CreateAccount(r'chromedriver\chromedriver.exe')
    obj.all_function_start()

if __name__ == "__main__":
    main()

Чистый JSON файл:
1668676156331.png

Завершение...
Вы научились взаимодействовать с сайтом и так же регистрировать аккаунт. Надеюсь, вам понравилась моя статья. Так же буду благодарен за нахождение ошибок в статье.

Решил оставить шпаргалочку здесь.
Библиотека FakerПоказывает:
fake.first_name()Имя человека;
fake.last_name()Фамилия человека;
en_phone_get = PhoneNumber("US")Получение американского номера;
fake.free_email()Почта(yahoo, gmail, yandex)
fake.street_address()Адрес улицы человека;
fake.city()Город;
fake.state()Штат/провинция;
fake.zipcode()Индекс код;
fake.username()Никнейм человека.

:coffee: Мануалы которые вам помогут

Selenium Documentation Python -
Faker Documantation Pyhon -
Ооп Python -
Установка Selenium и реальное применение - click()
 
Последнее редактирование модератором:

dream to perfection

Green Team
11.06.2022
59
35
BIT
0
# CONTACT INFORMATION firstname = elements_reg["ContactInfo"][0] lastname = elements_reg["ContactInfo"][1] phone_reg = elements_reg["ContactInfo"][2] email = elements_reg["ContactInfo"][3] # MAILING INFORMATION address = elements_reg["MailingInfo"][0] city = elements_reg["MailingInfo"][1] state = elements_reg["MailingInfo"][2] zipcode = elements_reg["MailingInfo"][3] country = elements_reg["MailingInfo"][4] # USER INFORMATION username = elements_reg["UserInfo"][0] password = elements_reg["UserInfo"][1] confirm = elements_reg["UserInfo"][2]
Дорогие друзья. Здесь я немного тупанул, при выводе ключа а именно значение элементов, можно сделать такой код:

Python:
firstname = elements_reg.get('ContactInfo')[0]
lastname = elements_reg.get('ContactInfo')[1]
phone_reg = elements_reg.get('ContactInfo')[2]
email = elements_reg.get('ContactInfo')[3]


# MAILING INFORMATION

address = elements_reg.get('MailingInfo')[0]
city = elements_reg.get('MailingInfo')[1]
state = elements_reg.get('MailingInfo')[2]
zipcode = elements_reg.get('MailingInfo')[3]
country = elements_reg.get("MailingInfo")[4]


# USER INFORMATION
username = elements_reg.get("UserInfo")[0]
password = elements_reg.get("UserInfo")[1]
confirm = elements_reg.get("UserInfo")[2]

таким образом мы с помощью get получаем значение ключа. Конечно можно использовать старый способ, ну как по мне это лучше и роднее.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!