Estoy trabajando en el mini crucigrama de Nytimes (https://www.nytimes.com/crosswords/ juego / mini).

Primero necesito hacer clic en el botón "Aceptar" cuando se carga la página (hice esto)

Luego "Revelar" y luego "Rompecabezas" en el menú de la derecha, pero los botones no tienen identificadores específicos como se puede ver a continuación.

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

Aquí está mi script de Python

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()
0
mert cihan 30 sep. 2019 a las 21:55

3 respuestas

La mejor respuesta

Puede hacer clic en un elemento usando su texto, en lugar de ID. En su caso, esto puede ayudar, ya que los elementos no tienen ID.

Para hacer clic en el botón de revelar:

# 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()

Para hacer clic en Puzzle, puede usar esta ruta:

# 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()
2
Christine 30 sep. 2019 a las 19:42

Para hacer clic en el rompecabezas debajo del menú de revelación induzca WebDriverWait y 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
KunduK 30 sep. 2019 a las 19:16

Edité tu guión un poco. Probé esto en mi extremo y funciona hasta el punto de presionar el botón 'Rompecabezas'. Recomiendo usar xpath también. Puede obtener el elemento xpath haciendo clic en inspeccionar hasta que aparezca la ubicación del elemento, luego haga clic derecho y copie con xpath. Así es como se ve el código

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()

También es importante tener en cuenta que si obtiene un error, puede deberse a que hay otro elemento que bloquea el botón en el que desea hacer clic.

1
Corey Goldberg 30 sep. 2019 a las 19:31
58173712