Как нажать на определенную кнопку с помощью selenium-python - PullRequest
0 голосов
/ 30 сентября 2019

Я работаю над мини-кроссвордом Nytimes (https://www.nytimes.com/crosswords/game/mini).

Сначала мне нужно нажать кнопку "ОК", когда страница загружается (я так и сделал)

затем «Выявить», затем «Загадку» из меню справа, но кнопки не имеют конкретных идентификаторов, как вы можете видеть ниже.

<div class="Toolbar-expandedMenu--2s4M4">
  <li class="Tool-button--39W4J Tool-tool--Fiz94 Tool-texty--2w4Br"><button>clear</button>
    <ul class="HelpMenu-menu--1Z_OA">
      <li class="HelpMenu-item--1xl0_" style="display:list-item" title="Won’t clear letters that are part of completed crossing words"><a>Incomplete</a></li>
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Word</a></li>
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Puzzle</a></li>
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Puzzle &amp; Timer</a></li>
    </ul>
  </li>
  <li class="Tool-button--39W4J Tool-tool--Fiz94 Tool-texty--2w4Br Tool-open--1Moaq"><button>reveal</button>
    <ul class="HelpMenu-menu--1Z_OA">
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Square</a></li>
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Word</a></li>
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Puzzle</a></li>
    </ul>
  </li>
  <li class="Tool-button--39W4J Tool-tool--Fiz94 Tool-texty--2w4Br"><button>check</button>
    <ul class="HelpMenu-menu--1Z_OA">
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Autocheck</a></li>
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Square</a></li>
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Word</a></li>
      <li class="HelpMenu-item--1xl0_" style="display:list-item"><a>Puzzle</a></li>
    </ul>
  </li>
</div>

Вот мой скрипт на питоне

from selenium import webdriver
import time

driver_path = "/home/xperia/PycharmProjects/cs461-getinput/chromedriver"
browser = webdriver.Chrome(executable_path=driver_path)
browser.get("https://www.nytimes.com/crosswords/game/mini")
time.sleep(5)
browser.find_element_by_class_name("buttons-modalButton--1REsR").click()
time.sleep(5)
browser.find_element_by_class_name("Tool-button--39W4J Tool-tool--Fiz94 Tool-texty--2w4Br").click()

Ответы [ 3 ]

2 голосов
/ 30 сентября 2019

Вы можете нажать на элемент, используя его текст, а не ID. В вашем случае это может помочь, поскольку элементы не имеют идентификатора.

Чтобы нажать кнопку раскрытия:

# wait for reveal button to exist
WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.XPATH,'//button[contains(text(), 'reveal')]'))).click()

# click reveal button
browser.find_element_by_xpath("//button[contains(text(), 'reveal')]").click()

Чтобы щелкнуть головоломку, вы можете использовать этот путь:

# wait for puzzle button to exist
WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.XPATH,'//li[button[contains(text(), 'reveal')]]/ul/li/a[text()='Puzzle']'))).click()

# click the reveal button
browser.find_element_by_xpath("//li[button[contains(text(), 'reveal')]]/ul/li/a[text()='Puzzle']").click()
1 голос
/ 30 сентября 2019

Нажать на головоломку при открывшемся меню вызвать WebDriverWait И element_to_be_clickable ()

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

driver_path = "/home/xperia/PycharmProjects/cs461-getinput/chromedriver"
browser = webdriver.Chrome(executable_path=driver_path)
browser.get("https://www.nytimes.com/crosswords/game/mini")
WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.XPATH,'//span[text()="ACCEPT AND CLOSE"]'))).click()
WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.CLASS_NAME,'buttons-modalButton--1REsR'))).click()
WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.XPATH,'//div[@class="Toolbar-expandedMenu--2s4M4"]//li/button[text()="reveal"]'))).click()
WebDriverWait(browser,10).until(EC.element_to_be_clickable((By.XPATH,'//button[text()="reveal"]/following::ul[1]//li/a[text()="Puzzle"]'))).click()
1 голос
/ 30 сентября 2019

Я немного отредактировал твой сценарий. Я проверил это на своем конце, и оно работает вплоть до нажатия кнопки «Головоломка». Я также рекомендую использовать xpath. Вы можете получить элемент xpath, нажимая inspect, пока не отобразится местоположение элемента, затем щелкните правой кнопкой мыши и скопируйте по xpath. Вот как выглядит код

from selenium import webdriver
import time

driver_path = "/home/xperia/PycharmProjects/cs461-getinput/chromedriver"
browser = webdriver.Chrome(executable_path=driver_path)
time.sleep(3)
browser.find_element_by_class_name("buttons-modalButton--1REsR").click()
time.sleep(2)
browser.find_element_by_xpath('//*[@id="root"]/div/div/div[4]/div/main/div[2]/div/div/ul/div[2]/li[2]/button').click()
browser.find_element_by_xpath('//*[@id="root"]/div/div/div[4]/div/main/div[2]/div/div/ul/div[2]/li[2]/ul/li[3]/a').click()

Также важно отметить, что если вы получаете ошибку, это может быть из-за того, что есть другой элемент, блокирующий кнопку, которую вы хотите нажать.

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