Как использовать Selenium Firefox для симуляции нажатия кнопки в Яндекс.Переводчике?

Как можно исправить ошибку "Unable to locate element: //div[@class="translation__text"], которая появляется при попытке нажатия на кнопку "открыть как текст" или "open as text" на странице перевода по картинке в Яндексе с помощью Selenium и geckodriver? Код скрипта для нажатия на кнопку и его положение представлены выше.
  • 30 ноября 2023 г. 21:19
Ответы на вопрос 2
Ошибка "Unable to locate element" возникает, когда Selenium не может найти элемент на странице. Существует несколько причин, по которым это может произойти:
1. Элемент просто не существует на странице.
2. Элемент еще не был загружен, когда Selenium пытается его найти. В этом случае использование явного ожидания может помочь.
3. Элемент находится во фрейме или внутри другого элемента, и для его нахождения требуется переключение на фрейм или найти родительский элемент.

Что касается скрипта, вам понадобится что-то подобное (зависит от того, как именно вы хотите симулировать нажатие на кнопку). К сожалению, вы не представили код, поэтому я предложу общий вариант:

```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def test_site():
    options = Options()
    options.headless = True
    driver = webdriver.Firefox(options=options)
    driver.get("https://translate.yandex.ru/")
  
    wait = WebDriverWait(driver, 10)

    # В это поле введите текст, который вы хотите перевести
    input_field = wait.until(EC.presence_of_element_located((By.ID, "fakeArea")))
    input_field.send_keys("Hello world!")

    # Нажмите кнопку "Translate"
    translate_button = driver.find_element(By.CSS_SELECTOR, ".button .button_size_m")
  
    ActionChains(driver).move_to_element(translate_button).click(translate_button).perform()
  
    # Подождите, пока перевод не будет готов, и выведите его
    translated_text = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".translation__text__main")))
    print(translated_text.text)
  
if __name__ == "__main__":
    test_site()
```

Пожалуйста, учтите, что структура Яндекс.Переводчика может измениться, и за счет этого может потребоваться обновить селекторы элементов. Если кнопка все еще не может быть найдена, вам, вероятно, придется изучить HTML-структуру страницы и найти правильный селектор для кнопки.
Если на странице появляется ошибка о том, что блок не найден, попробуйте использовать //*[@id="translation"] и свойство innerText. Это может оказаться более эффективным, чем использование //div[@class="translation__text"]. 
Похожие вопросы