Я пытаюсь использовать selenium и общаться с некоторыми ботами в character.ai, дело в том, что когда я отправляю ввод и получаю ответ, я получаю только небольшую часть всего ответа, потому что div постоянно меняется .
Вот фрагмент кода, который я реализовал до сих пор:
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import StaleElementReferenceException
import undetected_chromedriver as uc
chrome_options = Options()
ignored_exceptions = (NoSuchElementException,StaleElementReferenceException)
driver = uc.Chrome(options=chrome_options)
driver.get("https://beta.character.ai/chat?char=YntB_ZeqRq2l_aVf2gWDCZl4oBttQzDvhj9cXafWcF8")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "#AcceptButton"))).click()
while True:
char_msgs= WebDriverWait(driver, 10000, ignored_exceptions=ignored_exceptions).until(EC.visibility_of_all_elements_located((By.CLASS_NAME, "markdown-wrapper-last-msg")))
for msg in char_msgs:
print(msg.text)
msg = str(input("Send message: "))
driver.find_element(By.ID, "user-input").send_keys(msg)
# press send button
buttons = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "btn")))
buttons[-2].click()
Как видите, я использую явное ожидание с webdriverwait, и хотя это работает (потому что ждет, пока что-то появится), я не могу найти способ заставить код ждать, пока этот div закончит изменяться и получить полный ответ.
Я изменил ваш код и использовал его так
то, что я сделал, чтобы заставить ii работать, - это добавленное условие для ожидания видимости кнопки остановки, что означает, что ответ генерируется, а затем невидимость кнопки остановки, которая указывает, что она прекратила генерацию ответа и изменила локатор, чтобы получить текст как //div[contains(@class,'markdown-wrapper-last-msg')]
WebDriverWait(driver, 120).until(
EC.visibility_of_element_located((By.XPATH, "//button[@aria-label='Stop Message Generation']")))
Полный код
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import StaleElementReferenceException
import undetected_chromedriver as uc
chrome_options = Options()
ignored_exceptions = (NoSuchElementException, StaleElementReferenceException)
driver = uc.Chrome(options=chrome_options)
driver.get("https://beta.character.ai/chat?char=YntB_ZeqRq2l_aVf2gWDCZl4oBttQzDvhj9cXafWcF8")
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "#AcceptButton"))).click()
while True:
msg = str(input("Send message: "))
driver.find_element(By.ID, "user-input").send_keys(msg)
# press send button
buttons = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME, "btn")))
buttons[-2].click()
WebDriverWait(driver, 120).until(
EC.visibility_of_element_located((By.XPATH, "//button[@aria-label='Stop Message Generation']")))
print("here 1")
WebDriverWait(driver, 120).until(
EC.invisibility_of_element_located((By.XPATH, "//button[@aria-label='Stop Message Generation']")))
print("here 2")
char_msgs = WebDriverWait(driver, 10000, ignored_exceptions=ignored_exceptions).until(
EC.visibility_of_element_located((By.XPATH, "//div[contains(@class,'markdown-wrapper-last-msg')]")))
print(char_msgs.text)
Работает -> Добавлен ввод, как показано ниже, 10 случайных слов
Теперь, когда все слова были сгенерированы
Полный сгенерированный текст был напечатан
Это работает как шарм, спасибо, я был слишком сосредоточен на этом div, чтобы даже заметить другие элементы.