硒元素即使可见也无法交互

问题描述 投票:0回答:1

我正在尝试使用 Python 中的 Selenium 编写一个爬虫,以从《纽约时报》畅销书网站购买排名第一的精装非小说类书籍。我遇到了麻烦,因为我似乎无法单击我想要的元素,即使我可以非常清楚地看到它是可见的。

这是我到目前为止所拥有的:

driver.get("https://www.nytimes.com/books/best-sellers/")
wait=WebDriverWait(driver, timeout=5)
time.sleep(3)
buyButton=driver.find_element(By.XPATH, "//section[@data-testid='section-hardcover-nonfiction']/ol/li[1]//button")
driver.execute_script("arguments[0].scrollIntoView(true);", buyButton)
buyButton.click()
wait.until(expected_conditions.presence_of_element_located((By.XPATH, "//a[contains(text(), 'Amazon')]")))
driver.find_element(By.XPATH, "//a[contains(text(), 'Amazon')]").click()

即使我可以在屏幕上看到链接,这也会导致“元素不可交互”错误。

python selenium-webdriver
1个回答
0
投票

页面上有 55 个与您的亚马逊定位器匹配的元素。您可以使用

$x("//a[contains(text(), 'Amazon')]")
在开发控制台中进行测试。

问题是你的定位器太通用了。一般来说,我处理此类事情的方式是:

  1. 找到包含每本书的容器元素

    //section[@data-testid='section-hardcover-nonfiction']//li
    
  2. 找到一种方法通过标题等找到您想要的书。

    //section[@data-testid='section-hardcover-nonfiction']//li//h3[text()='SOMEHOW']
    
  3. 找到对应的BUY按钮

    //section[@data-testid='section-hardcover-nonfiction']//li[.//h3[text()='SOMEHOW']]//button
    
  4. 找到对应的亚马逊链接

    //section[@data-testid='section-hardcover-nonfiction']//li[.//h3[text()='SOMEHOW']]//a[text()='Amazon']
    
  5. 自定义 XPath,以便我们可以将书名传递为

    book_name

    f"//section[@data-testid='section-hardcover-nonfiction']//li[.//h3[text()='{book_name}']]//a[text()='Amazon']"
    

现在我们将其放入一个简短的脚本中

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.maximize_window()
url = "https://www.nytimes.com/books/best-sellers/"
driver.get(url)

book_name = "SOMEHOW"
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.XPATH, f"//section[@data-testid='section-hardcover-nonfiction']//li[.//h3[text()='{book_name}']]//button"))).click()
wait.until(EC.element_to_be_clickable((By.XPATH, f"//section[@data-testid='section-hardcover-nonfiction']//li[.//h3[text()='{book_name}']]//a[text()='Amazon']"))).click()

我测试了上面的脚本,它有效......它登陆了亚马逊登录页面。

© www.soinside.com 2019 - 2024. All rights reserved.