如何使用 selenium 单击 html 中的文本?

How to click on text in html using selenium?

我有这样的地区名称:Anantapur、Chittoor 等。我有 13 个地区。我必须点击每个地区。这是 HTML 的样子:

</tr>
<tr class="gridRowStyle" align="center" style="color:#000066;">
    <td>
                                        1
    </td>
    <td align="left">
        <a id="ctl00_ContentPlaceHolder1_Grid_Dist_ctl02_lnkbtnDist" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$Grid_Dist$ctl02$lnkbtnDist','')">Anantapur</a>
    </td>
    <td align="right">
        <span id="ctl00_ContentPlaceHolder1_Grid_Dist_ctl02_lblDman">63</span>
    </td>
    <td align="right">
        <span id="ctl00_ContentPlaceHolder1_Grid_Dist_ctl02_lblMvill">2856</span>
    </td>
    <td align="right">
        <span id="ctl00_ContentPlaceHolder1_Grid_Dist_ctl02_lblMcon">215441</span>
    </td>
    <td align="right">
        <span id="ctl00_ContentPlaceHolder1_Grid_Dist_ctl02_lblDNExist">49681</span>
    </td>
    <td align="right">
        <span id="ctl00_ContentPlaceHolder1_Grid_Dist_ctl02_lblDExist">165760</span>
    </td>
    <td align="right">
        <span id="ctl00_ContentPlaceHolder1_Grid_Dist_ctl02_lblMupcon">215437</span>
    </td>
    <td align="right">
        <span id="ctl00_ContentPlaceHolder1_Grid_Dist_ctl02_lblPer">100.00</span>
    </td>
</tr>
<tr class="gridAlterRowStyle" align="center" style="color:#000066;">
    <td>
                                        2
    </td>
    <td align="left">
        <a id="ctl00_ContentPlaceHolder1_Grid_Dist_ctl03_lnkbtnDist" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$Grid_Dist$ctl03$lnkbtnDist','')">Chittoor</a>

我试过用 Selenium 单击文本,但不知何故我做不到。

Python

a=[2,14]
for i in a:
driver.find_element_by_xpath("//table[@id='ctl00_ContentPlaceHolder1_Grid_Dist']//tr[i]//td[2]").click()
driver.execute_script("window.history.go(-1)")

我需要点击 Anantapur、Chittoor 等文本。但它不起作用。仅供参考:这是网站:http://65.19.149.160/gws/reports.aspx

如果能提供更多有关您卡在何处的信息,将有助于我们更好地回答问题。然而,所需的元素是 JavaScript enabled element so to click() on the element you need to induce WebDriverWait for the desired element_to_be_clickable() and you can use the following :

  • 代码块:

    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
    chrome_options = webdriver.ChromeOptions() 
    chrome_options.add_argument("start-maximized")
    # chrome_options.add_argument('disable-infobars')
    driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
    base_url = "http://65.19.149.160/gws/reports.aspx"
    driver.get(base_url)
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Anantapur"))).click()
    print("Data from Anantapur district")
    driver.get(base_url)
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "Chittoor"))).click()
    print("Data from Chittoor district")
    
  • 控制台输出:

    Data from Anantapur district
    Data from Chittoor district
    

单击每个 District 名称 首先,您需要获取网络上可用的总区数 table,然后 iterate 每个区和 click.Once 单击 link 它 navigates 到一个new page 所以你需要使用 driver.back() 到 return 到初始页面并继续。

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=webdriver.Chrome()
driver.get("http://65.19.149.160/gws/reports.aspx")

Districts=WebDriverWait(driver,10).until(EC.presence_of_all_elements_located((By.XPATH,"//table[@id='ctl00_ContentPlaceHolder1_Grid_Dist']//a[contains(@id,'ctl00_ContentPlaceHolder1_Grid_Dist_ctl')]")))

for d in range(len(Districts)):
  Districts = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.XPATH,"//table[@id='ctl00_ContentPlaceHolder1_Grid_Dist']//a[contains(@id,'ctl00_ContentPlaceHolder1_Grid_Dist_ctl')]")))
  print("District Name clicked :" + Districts[d].text)
  Districts[d].click()
  driver.back()

控制台输出:

District Name clicked :Anantapur
District Name clicked :Chittoor
District Name clicked :East Godavari
District Name clicked :Guntur
District Name clicked :Kadapa
District Name clicked :Krishna
District Name clicked :Kurnool
District Name clicked :Nellore
District Name clicked :Prakasam
District Name clicked :Srikakulam
District Name clicked :Visakhapatnam
District Name clicked :Vizianagaram
District Name clicked :West Godavari
  1. 考虑使用更清晰的 XPath 定位器,因为这些 //tr[i]//td[2] 不可读且非常脆弱,以防最小 DOM change the locators will become invalid. I would recommend sticking to partial id attribute 像:

    //a[contains(@id,'lnkbtnDist')]
    

    查看以下内容material 以掌握 XPath:

  2. 离开页面并全部返回后 WebElements will be invalidated and you will have to find them once again. To avoid this you can use list comprehension 并将 WebElements 列表转换为字符串列表(地区名称)

    districts = [link.text for link in driver.find_elements_by_xpath("//a[contains(@id,'lnkbtnDist')]")]
    
  3. 假设以上所有你可以修改你的代码看起来像:

    driver.get("http://65.19.149.160/gws/reports.aspx")
    
    districts = [link.text for link in driver.find_elements_by_xpath("//a[contains(@id,'lnkbtnDist')]")]
    
    for district in districts:
        driver.find_element_by_link_text(district).click()
        driver.execute_script("window.history.go(-1)")