Не удается найти элемент по xpath в селене? - PullRequest
0 голосов
/ 02 апреля 2020

Я изучаю python и селен прямо сейчас, создав небольшой сценарий, который публикует комментарии ко дню рождения моих друзей в Facebook. Я могу успешно войти в систему и перейти к модалу «день рождения друзей», но я не могу комментировать в текстовом поле.

Вот ошибка, которую я получаю:

selenium.common.exceptions.NoSuchElementException: 
Message: no such element: Unable to locate element:
{"method":"xpath","selector":"//*[@id="u_i_6"]"}

У меня не было проблем с поиском других элементов страницы через XPath, поэтому я не уверен, что является причиной проблемы. Я также попытался найти текстовое поле для комментариев через имя класса, но результат был тот же. Может кто-нибудь предложить некоторые мысли?

enter image description here

РЕДАКТИРОВАТЬ: забыл вставить код

from selenium import webdriver
from pynput.keyboard import Key, Controller
import time
import config
# fetch facebook password from separate file in the same directory
pw = config.secret['pw']
keyboard = Controller()

driver = webdriver.Chrome()
options = webdriver.ChromeOptions()
options.add_argument('--disable-extensions')
options.add_argument('--disable-notifications')

# navigate to facebook url
driver.get('https://facebook.com')

# input email address
email_input = driver.find_element_by_xpath('//*[@id="email"]')
email_input.send_keys(<omitted>)
# input pw
password_input = driver.find_element_by_xpath('//*[@id="pass"]')
password_input.send_keys(pw)
# click login button element
login_button = driver.find_element_by_xpath('//*[@id="u_0_b"]')
login_button.click()

home_button = driver.find_element_by_xpath('//*[@id="u_0_c"]/a')
# wait 8 seconds for browser popup before pressing esc to get out
time.sleep(8)
keyboard.press(Key.esc)

# check if there are any birthdays today
birthday_section = driver.find_element_by_xpath('//*[@id="home_birthdays"]/div/div/div/div/a/div/div/span/span[1]')
birthday_section.click()

first_comment = driver.find_element_by_xpath('//*[@id="u_i_6"]')
first_comment.send_keys('happy birthday!')
# click post button to post comment

# close browser window after actions are complete
time.sleep(5)
driver.close()

1 Ответ

1 голос
/ 02 апреля 2020

Трудно ответить без кода, но вот пара идей:

  1. Убедитесь, что вы используете Selenium wait , неявное или явное, поэтому ваш код не выполняет поиск элемента до того, как этот элемент появится на странице. Вы можете добавить этот код после driver.get() для неявного ожидания:
driver.implicitly_wait(5)
Кроме того, похоже, что идентификаторы являются динамическими c на этой странице, я получаю другой идентификатор на своей странице FB. Попробуйте использовать это xpath, чтобы найти текстовую область:
"//form[contains(@action, 'birthday')]//textarea"

Надеюсь, это полезно, удачи!

...