Selenium WebDriver - Невозможно найти элемент? - PullRequest
0 голосов
/ 26 февраля 2020

Код

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
chrome = webdriver.Chrome(executable_path= 'C:\webdriver.exe\chromedriver.exe',port=9515)
url = 'https://protonmail.com/'
chrome.get(url)
chrome.implicitly_wait(10)
chrome.find_element_by_xpath('//*[@class="btn btn-default btn-short"]').click()
chrome.find_element_by_class_name("panel-heading").click()
chrome.find_element_by_id("freePlan").click()
chrome.find_element_by_id('username')
chrome.find_element_by_id("password").send_keys('password')
chrome.find_element_by_id("passwordc").send_keys('password')

HTML

<input placeholder="Choose username" required="" name="username" messages="[object Object]" iframename="top" pattern=".{1,40}" id="username" class="input">

Проблема

chrome.find_element_by_id('username')

Я пытаюсь ввести имя пользователя; однако python говорит, что не может найти элемент, даже если я использую идентификатор, который он вам дает, который является именем пользователя

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Привет, я только что изменил твой код, и теперь он работает -:

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

import time

chrome = webdriver.Chrome(executable_path= 'C:\webdriver.exe\chromedriver.exe',port=9515)

url = 'https://protonmail.com/'

chrome.get(url)

chrome.implicitly_wait(10)

chrome.find_element_by_xpath('//*[@class="btn btn-default btn-short"]').click()

chrome.find_element_by_class_name("panel-heading").click()

chrome.find_element_by_id("freePlan").click()

time.sleep(10)

#chrome.find_element_by_xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "top", " " ))]')

chrome.switch_to.frame(chrome.find_element_by_xpath('//*[contains(concat( " ", @class, " " ), concat( " ", "top", " " ))]'))
typeinput = chrome.find_element_by_xpath('//*[@id="username"]')
typeinput.click()
typeinput.clear()
typeinput.send_keys('password')

chrome.switch_to.default_content()

chrome.find_element_by_id("password").send_keys('password')

chrome.find_element_by_id("passwordc").send_keys('password')
0 голосов
/ 26 февраля 2020

Есть и другие вещи, о которых нужно позаботиться, пока вы моделируете действие в AUT. т.е. прядильщик и загрузчик. Таким образом, вы должны также справиться с этим.

Введите ExplicitWait в свой код. Было замечено, что при нажатии на кнопку «Регистрация», он начинает показывать загрузчик, а затем отображает планы. Таким образом, обрабатывать этот код, указанный ниже, пока этот загрузчик не будет скрыт, а затем выполнить щелчок по нужному плану.

chrome.find_element_by_xpath('//*[@class="btn btn-default btn-short"]').click()
WebDriverWait(chrome, 20).until(EC.invisibility_of_element_located((By.ID, "redir"))
chrome.find_element_by_css_selector("div[aria-controls='plan-free']").click()

И при выполнении нажмите на кнопку Free Plan, она перенаправит на новую страницу и покажет загрузку новой страницы, а затем загрузит форму регистрации. Для этого используйте приведенный ниже код -

WebDriverWait(chrome, 10).until( EC.invisibility_of_element_located((By.ID, "pm_slow"))

И имя пользователя в регистрационной форме загружается под iframe, поэтому вам нужно сначала переключиться на iframe, а затем выполнить дальнейшие действия

username_frame = chrome.find_element_by_xpath("//div[@class='usernameWrap']//iframe[@title='Registration form']")
chrome.switch_to.frame(username_frame)
WebDriverWait(chrome, 10).until( EC.visibility_of_element_located((By.ID, "username"))
chrome.find_element_by_id('username').send_keys(‘username’)
chrome.switch_to.default_content()
chrome.find_element_by_id("password").send_keys('password')
chrome.find_element_by_id("passwordc").send_keys('password')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...