Кликер

Folklor

Новичок
Пользователь
Апр 12, 2025
1
0
1
Здравствуйте, мне нужно написать программу которая открывает страницу и нажимает на определённую кнопку:

import time
import chromedriver_autoinstaller
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

wait = WebDriverWait(driver, 20)

element = wait.until(EC.presence_of_element_located((By.XPATH, '//button[@type="submit"]')))

element.click()

print("Нажата кнопка входа")

time.sleep(2)

wait = WebDriverWait(driver, 20)

element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'button.button:nth-child(2)')))

element.click()

print("Нажата кнопка игры")

#a = input()

wait = WebDriverWait(driver, 20)

ment = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '.tabContent > div:nth-child(3) > a:nth-child(1)')))

element.click()



Код работает пока не доходит до последней кнопки, которая находится на самой странице игры:

<a id="js_CityPosition17Link" class="hoverable" onclick="ajaxHandlerCall(this.href);return false;" href="?view=pirateFortress&amp;cityId=27141&amp;position=17&amp;backgroundView=city&amp;currentCityId=27141&amp;actionRequest=eaccbf3d792ad75cc1ad699862126724" title="Крепость пиратов (2)"></a>



Через Xpath тоже не выходит,



Как можно решить проблему?
 

Dr. Mundo

Модератор
Команда форума
Модератор
Фев 13, 2024
29
1
3
Здравствуйте! Я вижу, что у вас возникла проблема с нажатием на последнюю кнопку в вашем Selenium-скрипте. Давайте разберемся и исправим ваш код.


Я заметил несколько проблем:
  1. В последнем блоке вы находите элемент и сохраняете его в переменную ment, но затем пытаетесь нажать на element, а не на ment.
  2. CSS-селектор отличается от HTML элемента, который вы пытаетесь найти.
  3. В коде отсутствует инициализация драйвера.

Вот исправленный вариант вашего кода:

Python:
import time
import chromedriver_autoinstaller
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

# Установка ChromeDriver
chromedriver_autoinstaller.install()

# Инициализация драйвера
driver = webdriver.Chrome()

# Здесь должен быть URL страницы, которую нужно открыть
driver.get("ваш_url_сайта")

wait = WebDriverWait(driver, 20)
element = wait.until(EC.presence_of_element_located((By.XPATH, '//button[@type="submit"]')))
element.click()
print("Нажата кнопка входа")
time.sleep(2)

wait = WebDriverWait(driver, 20)
element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'button.button:nth-child(2)')))
element.click()
print("Нажата кнопка игры")

# Для последней кнопки используем id или полный XPath
wait = WebDriverWait(driver, 20)
pirate_fortress = wait.until(EC.element_to_be_clickable((By.ID, 'js_CityPosition17Link')))
pirate_fortress.click()
print("Нажата кнопка крепости пиратов")

# Альтернативный вариант с использованием XPath
# pirate_fortress = wait.until(EC.element_to_be_clickable((By.XPATH, '//a[@id="js_CityPosition17Link"]')))
# pirate_fortress.click()

# Даем время посмотреть результат
time.sleep(5)

# Закрываем браузер
driver.quit()

Обратите внимание на следующие изменения:


  1. Добавлена инициализация драйвера Chrome
  2. Добавлен вызов метода get() для открытия страницы
  3. Для последней кнопки использую поиск по ID вместо CSS-селектора
  4. Исправлена ошибка с переменной (ment → используем правильную переменную pirate_fortress)
  5. Использован метод element_to_be_clickable вместо presence_of_element_located, что более подходит для кнопок
  6. Добавлено закрытие браузера в конце

Если элемент все еще не находится, возможно, он находится внутри iframe или динамически загружается JavaScript. В этом случае попробуйте следующие варианты:


  1. Проверить, не находится ли элемент внутри iframe:
Python:
# Сначала переключитесь на iframe, если он есть
iframe = wait.until(EC.presence_of_element_located((By.TAG_NAME, 'iframe')))
driver.switch_to.frame(iframe)

# Затем найдите элемент
pirate_fortress = wait.until(EC.element_to_be_clickable((By.ID, 'js_CityPosition17Link')))
pirate_fortress.click()

# После выполнения действий внутри iframe вернитесь к основному документу
driver.switch_to.default_content()

Попробовать использовать JavaScript для клика:

Python:
pirate_fortress = wait.until(EC.presence_of_element_located((By.ID, 'js_CityPosition17Link')))
driver.execute_script("arguments[0].click();", pirate_fortress)
 

Форум IT Специалистов