Как вставить значение в поле Text с помощью Selenium? - PullRequest
1 голос
/ 13 января 2020

Я не могу вставить значение в текст поля в html формуляре с использованием Selenium Python:

У меня есть HTML:

<div data-react-toolbox="input" class="_2dBwA"><input type="text" placeholder="Endereço de e-mail" class="_2WvFs" role="input"><span class="fT1WI"></span></div>

и этот XPath:

(Copy Xpath) //*[@id="root"]/div/div[2]/div[2]/div/input

и это:

(Copy outerHTML) <input type="text" placeholder="Endereço de e-mail" class="_2WvFs" role="input">

Я сделал это, но не сработало:

[In]: login_name = 'Cassandra'
[In]: insert_login_name = driver.find_element_by_xpath('//input[@id="root"]')
[In]: insert_login_name.send_keys(login_name);

[Out]: NoSuchElementException:  Message: no such element: Unable to locate element: {"method":"xpath","selector":"//input[@id="root"]"}

После ввода текста в этом текстовом поле, результат будет быть в html 'values' = 'Cassandra'

<div data-react-toolbox="input" class="_2dBwA"><input type="text" placeholder="Endereço de e-mail" class="_2WvFs _3QmiH" role="input" value='Cassandra'><span class="fT1WI"></span></div>

Что я могу сделать? Я новичок в этом. Спасибо

Ответы [ 4 ]

2 голосов
/ 14 января 2020

Индукция WebDriverWait и element_to_be_clickable () и следующий css селектор.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.get("https://www.atlasgov.com/login")
WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.CSS_SELECTOR,'div[data-react-toolbox="input"] >input[placeholder="E-mail address"][role="input"]'))).send_keys("Cassandra")

Снимок браузера:

enter image description here


Обновлен Xpath.


WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'//div[@data-react-toolbox="input" and @class="_2dBwA"]/input[@role="input"]'))).send_keys("Cassandra")

ИЛИ

WebDriverWait(driver,20).until(EC.element_to_be_clickable((By.XPATH,'(//div[@data-react-toolbox="input"]//input[@role="input"])[1]'))).send_keys("Cassandra")
2 голосов
/ 13 января 2020

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

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[data-react-toolbox='input']>input[placeholder='Endereço de e-mail'][type='text']"))).send_keys(login_name)
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@data-react-toolbox='input']/input[@placeholder='Endereço de e-mail' and @type='text']"))).send_keys(login_name)
    
  • Примечание : необходимо добавить следующие операции импорта:

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

Обновление

Кажется, это была языковая проблема. Изменение атрибута значение из placeholder с Endereço de e-mail на E-mail address работает безупречно.

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div[data-react-toolbox='input']>input[placeholder*='mail'][type='text']"))).send_keys(login_name)
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//div[@data-react-toolbox='input']/input[contains(@placeholder, 'mail') and @type='text']"))).send_keys(login_name)
    

Ссылка

Соответствующее подробное обсуждение можно найти в:

0 голосов
/ 13 января 2020

Это вопрос о неправильном локаторе xpath. Хотя в данном Html нет элемента с ID в качестве root, но, похоже, может быть любой родительский узел с ID в качестве root. Пожалуйста, попробуйте с данным xpath на основе предоставленного html. Надеюсь, это сработает:

driver.find_element_by_xpath("//input[@placeholder='Endereço de e-mail']");
0 голосов
/ 13 января 2020

Сообщение об ошибке довольно ясно: селен не может найти элемент в данном xpath. Поскольку у вас есть идентификатор элемента, просто используйте его напрямую вместо xpath.

driver.find_element_by_id('root')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...