如何使用Selenium-Python单击特定按钮

时间:2019-09-30 18:55:05

标签: python selenium

我正在研究Nytimes迷你填字游戏(https://www.nytimes.com/crosswords/game/mini)。

首先,我需要在页面加载时单击“确定”按钮(我这样做了)

然后从右侧菜单中依次显示“显示”和“拼图”,但是按钮没有特定的ID,如下所示。

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

这是我的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()

3 个答案:

答案 0 :(得分:2)

您可以使用元素的文本而不是ID单击元素。对于您来说,这可能会有所帮助,因为元素没有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 :(得分:1)

我稍微修改了您的脚本。我对此进行了测试,直到按“ Puzzle”按钮为止。我建议也使用xpath。您可以通过单击检查直到弹出该元素的位置来获取xpath元素,然后右键单击并按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()

还要特别注意,如果出现错误,可能是因为还有另一个元素阻止了您要单击的按钮。

答案 2 :(得分:1)

要在显示菜单下单击拼图,请诱导WebDriverWaitelement_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()