【问题标题】:Python Selenium - How to click element that is not a buttonPython Selenium - 如何单击不是按钮的元素
【发布时间】:2020-05-26 01:15:14
【问题描述】:

我在 python 中使用 selenium 并尝试单击不是按钮类的元素。我正在使用 Google Chrome 作为我的浏览器/网络驱动程序

这是我的代码:

from selenium import webdriver
from bs4 import BeautifulSoup

driver = webdriver.Chrome(executable_path="/Users/ep9k/Desktop/SeleniumTest/drivers/chromedriver")

driver.get('http://tax.watgov.org/WataugaNC/search/commonsearch.aspx?mode=address')
driver.find_element_by_name('btAgree').click()             #clicks 'Agree' button to agree to site's terms                                            

driver.find_element_by_name('inpNumber').send_keys('190')
driver.find_element_by_name('inpStreet').send_keys('ELI HARTLEY')
driver.find_element_by_name('btSearch').click()

这会将我带到此页面:

我可以解析结果 HTML(例如 Beautiful Soup),但我想点击它们。如果我检查第一行元素,我会看到它保存在 div 元素中,样式为“margin-left:3px;”。

但这不是按钮元素,所以正常的click()函数不起作用。有没有办法点击这个? 例如,如果我点击第一行结果,我会被带到这个页面,其中包含更多信息(这是我真正想要的):

【问题讨论】:

    标签: python html selenium selenium-webdriver selenium-chromedriver


    【解决方案1】:

    元素不必是可点击的按钮。

    运行您的代码后,我添加了:

    results = driver.find_elements_by_class_name('SearchResults')
    first_result = results[0]
    first_result.click()
    

    它对我来说非常好。

    很可能你试图点击一些不同的元素,这就是它不起作用的原因

    编辑: 更准确地说,很可能您尝试单击<tr> 标记内的 div 元素。 而<tr> 标签包含javascript:selectSearchRow('../Datalets/Datalet.aspx?sIndex=1&idx=1'),所以你的脚本应该点击这个标签而不是<div>

    【讨论】:

    • 这行得通,谢谢!还有一个问题。你怎么知道使用类名“SearchResults”?当我查看页面源代码时,我不清楚您是如何选择这个而不是为每个结果选择单独的
      标签
    • @ErichPurpur 我刚开始检查整个表格并转到表格子标签然后我注意到<tr> 标签包含onclick 属性所以我知道这个元素应该是可点击的,然后我注意到具有结果的行包含该类。
    【解决方案2】:

    使用 xpath 单击第一行 - 见下文。 假设您想在此之后解析每个结果(包裹),请使用导航按钮;这是您可以使用的结构:

    table = driver.find_elements_by_xpath("//table[@id='searchResults']")
    table[0].click()
    
    #  Extract the total number of parcels from string e.g. "1 of 24"
    string=driver.find_element_by_xpath("//input[@name='DTLNavigator$txtFromTo']").get_attribute('value')
    #  split string in separate words; last word i.e. [-1] is the total number of parcels e.g. "24"
    total_parcels=string.split(' ')[-1]
    
    for record in range(int(total_parcels)):
        # >>> parse record here <<<
        driver.find_element_by_xpath("//input[@name='DTLNavigator$imageNext']").click()
        time.sleep(0.5) # be considerate to your source and don't load their server with numerous quick requests
    

    【讨论】:

      【解决方案3】:

      诱导WebDriverWait 并跟随css 选择器点击表格项。

      from selenium import webdriver
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.webdriver.common.by import By
      from bs4 import BeautifulSoup
      driver = webdriver.Chrome(executable_path="/Users/ep9k/Desktop/SeleniumTest/drivers/chromedriver")
      driver.get('http://tax.watgov.org/WataugaNC/search/commonsearch.aspx?mode=address')
      WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"btAgree"))).click()
      WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"inpNumber"))).send_keys('190')
      WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"inpStreet"))).send_keys('ELI HARTLEY')
      WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.NAME,"btSearch"))).click()
      WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"tr.SearchResults"))).click()
      

      浏览器快照:

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签