Selenium Automation - проблема взаимодействия - PullRequest
1 голос
/ 04 августа 2020

Я работаю над ботом, способным войти на веб-страницу (postmark.com). Для этого я использую селен и python. На данный момент мой код может получить доступ к веб-странице, нажав на кнопку входа в систему, вставив имя пользователя и пароль; однако, когда дело доходит до нажатия на кнопку входа (для доступа к учетной записи), я получаю следующую ошибку:

Traceback (most recent call last):
  File "/home/pi/Documents/Bot_Poshmark.py", line 20, in <module>
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Log)).click()
  File "/usr/local/lib/python3.7/dist-packages/selenium/webdriver/support/wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

Странно думать об этом, что иногда (например, 2 или 3) один и тот же кусок код, который я написал, может выполнить все шаги. Вот мой код (для этого я использую Raspberry Pi 4)

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

driver = webdriver.Chrome()
driver.get("https://www.poshmark.com") #Open webpage
Log_Field=(By.XPATH, "//a[contains(text(),'Log in')]")
Email= (By.XPATH, "//input[@placeholder='Username or Email']")
Pass= (By.XPATH, "//input[@placeholder='Password']")
Log= (By.XPATH, "//button[@class='btn btn--primary']")

WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Log_Field)).click()
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Email)).send_keys("xxx@xx.com")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Pass)).send_keys("123456")
WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Log)).click()

Кто-нибудь знает, почему это происходит? Спасибо

1 Ответ

0 голосов
/ 04 августа 2020

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

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

    driver.get("https://poshmark.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[href='/login']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#login_form_username_email"))).send_keys("xxx@xx.com")
    driver.find_element_by_css_selector("input#login_form_password").send_keys("123456")
    driver.find_element_by_css_selector("button.btn.blue.btn-primary").click()
    
  • Использование XPATH:

    driver.get("https://poshmark.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Log in']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@id='login_form_username_email']"))).send_keys("xxx@xx.com")
    driver.find_element_by_xpath("//input[@id='login_form_password']").send_keys("123456")
    driver.find_element_by_xpath("//button[@class='btn blue btn-primary']").click()
    
  • Примечание : Вам необходимо добавить следующие импорты:

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

Этот вариант использования

В этом варианте использования строка:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable(Log)).click()

не смогла идентифицировать желаемый элемент в течение желаемого периода времени, поэтому вы столкнулись с TimeoutException .

Однако из TimeoutException будет сложно определить фактический результат сбоя.

Решение

В качестве решения, чтобы узнать точную причину сбоя, вам необходимо удалить WebDriverWait и заменить строку кода на:

  • find_element_by_class_name(name)
  • find_element_by_css_selector(css_selector)
  • find_element_by_id(id)
  • find_element_by_link_text(link_text)
  • find_element_by_name(name)
  • find_element_by_partial_link_text(partial_link_text)
  • find_element_by_tag_name(tag_name)
  • find_element_by_xpath(xpath)

При необходимости вы можете замедлить поиск, вызывающий ожидание, через time.sleep(secs) во время отладки .

Ссылки

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

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