繁体   English   中英

如何在 Python 中使用 Selenium 单击不是按钮的元素

[英]How to click on an element that is not a button using Selenium in Python

我是 web 抓取的新手,我正在尝试从这个房地产网站抓取数据以仅获取最近租用的地方。 为此,我需要从该下拉菜单中单击“租赁列表”。 我需要点击的图片

我遇到的问题是这不是按钮 class 所以使用 selenium.click() function 给我一个错误。 还有多个对象具有与“租赁列表”部分相同的 class 名称。

这是我的代码:

 for page in range(0, total_pages + 1):
  chrome_options = webdriver.ChromeOptions()
  chrome_options.add_argument('--headless')
  chrome_options.add_argument('--no-sandbox')
  chrome_options.add_argument('--disable-dev-shm-usage')
  driver = webdriver.Chrome('chromedriver',chrome_options=chrome_options)
  headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0 ; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'}
  url = 'https://www.zoocasa.com/toronto-on-real-estate-for-rent?page=' + str(page)
  driver.get(url)
  elements = driver.find_elements(By.CLASS_NAME, "style_component__DR_Bs")
  elements[6].click() #Leased listing is the 7th appearance of this class name

这里是该站点的 html (无论点击什么都有“style_active__eGbvT”):

<div class="style_component__DR_Bs">
    ::before
    Active Listing
    ::after
</div>
<div class="style_component__DR_Bs style_active__eGbvT">
    ::before
    Leased Listing
    ::after
</div>
<div class="style_component__DR_Bs">
    ::before
    Expired Listing
    ::after
</div>

如果有人有任何建议,我将不胜感激,谢谢。

抱歉,由于我的声誉,无法发表评论 <50

我认为 selenium 允许点击div

但是,您需要在继续之前识别正确的divid

最简单的方法,你可以driver.find_elements_by_xpath ,它会返回一个列表,然后你需要检查每个项目的text

代码:

list_subcontent = driver.find_elements_by_xpath(".//div[@class='style_component__lT4sh style_theme-dark__rZF3s']//div[@class='style_component__DR_Bs ']")

for item in list_subcontent:
    if item.text == 'Leased Listing':
        item.click()

如果这有帮助,请帮助投票

这里有2个问题:

  1. 您正在尝试在页面完全加载之前访问元素。 解决此问题的最佳方法是使用预期条件显式等待以等待某些元素可见性等。
  2. 与您的定位器匹配的元素不可点击。 您必须打开下拉菜单才能使该元素可点击。
    这应该会更好:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get(url)
wait = WebDriverWait(driver, 20)
wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@class,'style_theme-dark')]//div[contains(text(),'Active Listings')]"))).click()
wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(@class,'style_theme-dark')]//div[contains(text(),'Leased Listing')]"))).click()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM