如何使用 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
考虑使用更清晰的 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:
离开页面并全部返回后 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')]")]
假设以上所有你可以修改你的代码看起来像:
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)")
我有这样的地区名称: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
考虑使用更清晰的 XPath 定位器,因为这些
//tr[i]//td[2]
不可读且非常脆弱,以防最小 DOM change the locators will become invalid. I would recommend sticking to partialid
attribute 像://a[contains(@id,'lnkbtnDist')]
查看以下内容material 以掌握 XPath:
离开页面并全部返回后 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')]")]
假设以上所有你可以修改你的代码看起来像:
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)")