Заполнение поля «Имя» на странице регистрации - PullRequest
0 голосов
/ 30 октября 2019

Проблема, которую я сейчас испытываю, пытается заполнить поле Имя со страницы регистрации. Мне удалось заполнить имя электронной почты и выбрать пол с помощью селена.

Когда я пытаюсь найти элемент First Name, используя его Xpath, я получаю selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="bb1bda44-91c9-4668-8641-4f3bbbd0c6cd"]"} ошибку

Код:

import selenium
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as Wait
from selenium.webdriver.support import expected_conditions

driver = selenium.webdriver.Chrome(executable_path='PATH')


def get_url(url):
    driver.get(url)
    driver.maximize_window()


def fill_data():
    # Find the signup button
    Wait(driver, 30).until(expected_conditions.presence_of_element_located
                           ((By.ID, 'signup-button'))).click()
    # Find the email name box
    email_name = Wait(driver, 30).until(expected_conditions.visibility_of_element_located
                                        ((By.XPATH, "/html/body/onereg-app/div/onereg-form/div/div/form/section/"
                                                    "section[1]/onereg-alias-check/fieldset/onereg-progress-meter"
                                                    "/div[2] "
                                                    "/div[2]/div/pos-input[1]/input")))
    # Enter the email name
    email_name.send_keys('Test')
    # Select gender
    driver.find_element_by_xpath('/html/body/onereg-app/div/onereg-form/div/div/form/section'
                                 '/section[2]/onereg-progress-meter/onereg-personal-info'
                                 '/fieldset/div/div/onereg-radio-wrapper[2]/pos-input-radio/label/i').click()
    # Find the first name box and fill out an account name
    driver.find_element_by_xpath('//*[@id="bb1bda44-91c9-4668-8641-4f3bbbd0c6cd"]')


get_url('https://www.mail.com/')
fill_data()

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Требуемый элемент является динамическим, поэтому для заполнения поля Имя необходимо ввести WebDriverWait для element_to_be_clickable(), и вы можете использовать любой из следующих Стратегии локатора :

  • Использование CSS_SELECTOR:

    driver.get("https://www.mail.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a#signup-button"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input[data-test='first-name-input']"))).send_keys("live for the hunt")
    
  • Использование XPATH:

    driver.get("https://www.mail.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@id='signup-button']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@data-test='first-name-input']"))).send_keys("live for the hunt")
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Снимок браузера:

mail.com

0 голосов
/ 30 октября 2019

Наблюдается несколько вещей: 1. ваш идентификатор является динамическим 2. Вы выполняете поиск элемента с вашим именем, но вы не отправляете ему текст

Пожалуйста, найдите решение ниже:

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By 
import time 
from selenium.webdriver.support.ui import WebDriverWait as Wait
from selenium.webdriver.common.action_chains import ActionChains


# Open Chrome
driver = webdriver.Chrome('C:\New folder\chromedriver.exe')



def get_url(url):
    driver.get(url)
    driver.maximize_window()


def fill_data():
    # Find the signup button
    Wait(driver, 30).until(EC.presence_of_element_located((By.ID, 'signup-button'))).click()
    # Find the email name box
    email_name = Wait(driver, 30).until(EC.visibility_of_element_located
                                        ((By.XPATH, "/html/body/onereg-app/div/onereg-form/div/div/form/section/"
                                                    "section[1]/onereg-alias-check/fieldset/onereg-progress-meter"
                                                    "/div[2] "
                                                    "/div[2]/div/pos-input[1]/input")))
    # Enter the email name
    email_name.send_keys('Tes323t')
    # Select gender
    driver.find_element_by_xpath('/html/body/onereg-app/div/onereg-form/div/div/form/section'
                                 '/section[2]/onereg-progress-meter/onereg-personal-info'
                                 '/fieldset/div/div/onereg-radio-wrapper[2]/pos-input-radio/label/i').click()
    # Find the first name box and fill out an account name
    Wait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//input[@data-test='first-name-input']"))).send_keys('Tes323t')


get_url('https://www.mail.com/')
fill_data()
...