Моя цель — войти на страницу (https://www.icribis.com/it/), введя свой адрес электронной почты и пароль. Первый шаг — отключить файлы cookie, второй — нажать кнопку «ACCEDI» в правом верхнем углу. На этом этапе я должен ввести свой адрес электронной почты и пароль и нажать кнопку «Accedi». Я скучаю по этой последней части. Это мой частичный код:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
url = 'https://www.icribis.com/it/'
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
driver.get(url)
time.sleep(2)
# Disable cookies
driver.execute_script('return document.querySelector("#usercentrics-root").shadowRoot.querySelector("#uc-center-container > div:nth-child(2) div > button:nth-child(3)")').click()
time.sleep(2)
# Click the button "ACCEDI"
driver.execute_script('return document.querySelector("body > section.menu > div.row.show-for-xlarge-up > div.large-10.medium-6.small-12.columns > div.large-12.medium-12.small-12.columns.text-right.menuTop > ul > li.openClick.text-left > a")').click()
time.sleep(2)
# Enter your email and password and click the button "Accedi"
# ...
driver.close()
Хотелось бы решить через использование XPath, так как их написание мне кажется более простым и компактным, но как они работают мне пока не очень понятно.
Как я могу закончить свой сценарий?
Вам не нужно использовать запрос JavaScript, чтобы открыть диалоговое окно входа в систему.
driver.execute_script('return document.querySelector("body > section.menu > div.row.show-for-xlarge-up > div.large-10.medium-6.small-12.columns > div.large-12.medium-12.small-12.columns.text-right.menuTop > ul > li.openClick.text-left > a")').click()
Это можно сделать обычным методом Selenium .click()
с использованием явного ожидания ожидаемых условий.
В этом случае вам не понадобятся жестко заданные паузы time.sleep(2)
, которые вы используете здесь.
Этот код работает и выглядит лучше:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
url = 'https://www.icribis.com/it/'
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 20)
driver.get(url)
time.sleep(2)
# Disable cookies
driver.execute_script('return document.querySelector("#usercentrics-root").shadowRoot.querySelector("#uc-center-container > div:nth-child(2) div > button:nth-child(3)")').click()
#login
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "li.openClick.text-left"))).click()
wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@style,'block')]//input[@name='email']"))).send_keys("your_email")
wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@style,'block')]//input[@name='password']"))).send_keys("your_password")
wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@style,'block')]//input[@type='submit']"))).click()
Ну, вы должны научиться создавать правильные локаторы. Это не сложно, но это также не лучший подход к использованию автоматически сгенерированных локаторов. Просто погуглите что-нибудь вроде how to create good locators in selenium
или selenium locators best practices
, и он даст вам несколько руководств по этому поводу.
Вы можете использовать приведенное ниже поле, чтобы ввести адрес электронной почты, пароль и нажать кнопку Accedi.
wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@class='dx']//input[@placeholder='Indirizzomail']"))).send_keys("EMAIL")
wait.until(EC.visibility_of_element_located((By.XPATH, "//div[@class='dx']//input[@placeholder='Password']"))).send_keys("PASSWORD")
wait.until(EC.element_to_be_clickable((By.XPATH,"//input[@class='button tiny lightRound rightIcon login']"))).click()
Спасибо за Ваш ответ. Мой единственный вопрос (в данном случае, но и вообще): как найти полный XPath? В таком случае, как вы нашли
"//div[contains(@style,'block')]//input[@name='email']"
?