Скрипт Selenium для поиска элемента textarea не работает - PullRequest
3 голосов
/ 04 мая 2020

Я пытаюсь автоматизировать размещение сообщений в моей учетной записи в социальных сетях. Я успешно написал сценарий для входа в систему, после входа в систему у меня возникли проблемы с поиском элемента textarea, с помощью которого будет проходить мое сообщение, после чего я попытаюсь прикрепить изображение к своему сообщению, создать сообщение и выйти из системы. Но сейчас я застрял в поиске текстовой области после входа в систему. Это код

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
usernameStr = 'JonJames3872@gmail.com'
passwordStr = 'JamesJon'
textStr = 'Testing my Post'
browser = webdriver.Chrome()
browser.get(('https://accounts.kingsch.at/?client_id=com.kingschat&scopes=%5B%22kingschat%22%5D&redirect_uri=https%3A%2F%2Fweb.kingsch.at%2F'))
# fill in username and password


password = browser.find_element_by_name('password')
password.send_keys(passwordStr)


username = browser.find_element_by_class_name('field')
username.send_keys(usernameStr)

signInButton = browser.find_element_by_class_name('submit-btn')
signInButton.click()

# I HAVE LOGGED IN, NOW THIS IS WHERE MY CODE HAS A PROBLEM

text = browser.find_element_by_xpath("/html/body/div[1]/div/div[2]/div/div[2]/div/div[1]/div/div/div[1]/textarea")
text.send_keys(textStr)

Это элемент из элемента inspect:

<textarea placeholder="What's happening?" class="KingingBox__input"></textarea>

Текст HTML Снимок экрана

Снимок экрана уведомления

1 Ответ

1 голос
/ 04 мая 2020
  1. Я вставил код, чтобы написать что-то в текстовой области
  2. Я вставил код, чтобы загрузить фотографию
  3. Я вставил код, чтобы опубликовать свой пост

Я думаю, что 3 из 3 вопросов уже выполнены.

Попробуйте этот код:

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
import os


path = '/home/avionerman/Documents/stack'
browser = webdriver.Firefox(path)
browser.implicitly_wait(10)


usernameStr = 'JonJames3872@gmail.com'
passwordStr = 'JamesJon'
textStr = 'Testing my Post'
browser.get(('https://accounts.kingsch.at/?client_id=com.kingschat&scopes=%5B%22kingschat%22%5D&redirect_uri=https%3A%2F%2Fweb.kingsch.at%2F'))
# fill in username and password


password = browser.find_element_by_name('password')
password.send_keys(passwordStr)


username = browser.find_element_by_class_name('field')
username.send_keys(usernameStr)

signInButton = browser.find_element_by_class_name('submit-btn')
signInButton.click()


text = browser.find_element_by_class_name('KingingBox__input')
text.clear()
text.send_keys(textStr)

time.sleep(5)

image = browser.find_element_by_class_name('KingingBox__attachment-input').send_keys('/here/path/of_yours/th_574e7c36606306d94a4.jpg')
time.sleep(5)


inserted_photo = browser.find_element_by_class_name('KingingBox__attachments-list')
if inserted_photo.is_displayed():
  print("Element found, photo uploaded successfully")
  browser.find_element_by_css_selector('.KingingBox__submit-btn').click()
else:
  print("Element not found")

В этой строке:

browser.implicitly_wait(10)

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

Также, как вы можете видеть, я использовал эту строку:

text = browser.find_element_by_class_name('KingingBox__input')

, чтобы найти текстовое поле.

В этой строке:

image = browser.find_element_by_class_name('KingingBox__attachment-input').send_keys('/here/path/of_yours/th_574e7c36606306d94a4.jpg')

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

В последней части:

inserted_photo = browser.find_element_by_class_name('KingingBox__attachments-list')
if inserted_photo.is_displayed():
  print("Element found, photo uploaded successfully")
  browser.find_element_by_css_selector('.KingingBox__submit-btn').click()
else:
  print("Element not found")

Я сохраняю в переменную paste_photo элемент, который показывает мне, что фотография успешно загружена. Затем, если эта переменная отображается, это означает, что фотография загружена правильно. Таким образом, поскольку у нас есть текст и фотография, мы готовы нажать кнопку «Опубликовать».

Попробуйте использовать атрибуты stati c, которые не являются динамическими c и нет опасности для будущего меняется. Таким образом, вы создаете стабильность своего кода. Потому что выбирать такой xpath, как в вашем примере, рискованно. Если div или другой тег будет исключен или включен сразу, xpath бесполезен.

PS : я загрузил два поста из-за тестирования, извините, что не смог ' Попробуйте по-другому.

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