簡體   English   中英

循環通過xpath查找元素,然后單擊找到的每個元素

[英]Looping through to find element by xpath and then click on each element found

我要自動化的網頁包含一個包含100多個鏈接(老師的名字)的列表,單擊該鏈接會加載該老師下注冊的學生的列表。 我的任務是單擊每個鏈接以確保加載學生信息(在同一頁面上),單擊瀏覽器后退按鈕,單擊第二個老師的姓名,依此類推,直到最后一個鏈接(老師的姓名)結束。

from selenium import webdriver
import time
driver=webdriver.Ie()
driver.get('I load my main page')
tablecontent=driver.find_elements_by_xpath("//table/tbody/tr/td/a") #see html code  provided below
tablelen=len(tablecontent) #find number of links on main page.
#loop through each link
for i in range(2,tablelen):
  driver.find_element_by_xpath("//table/tbody/tr[i]/td/a").click() #plug in i value to tr
  time.sleep(2)
  driver.back()

上面的代碼生成下面的錯誤

Traceback (most recent call last):
  File "C:/Python27/syn_xpath.py", line 14, in <module>
    driver.find_element_by_xpath("//table/tbody/tr[i]/td/a").click()
NoSuchElementException: Message: Unable to find element with xpath == //table/tbody/tr[i]/td/a

如果我將tr[i]替換為tr[2] (或方括號內的任何整數值),它將識別該元素並單擊它。 例如, driver.find_element_by_xpath("//table/tbody/tr[2]/td/a").click()正常運行。 知道為什么通過i (在for循環中)將整數值傳遞給tr無效嗎?

HTML代碼:

<table>
<tr><td nowrap><b>Teacher</b></td><td nowrap><b>School</b></td></tr>
<tr><td><a href="/db/status.php?teacherid=1234">Teacher1</a></td><td>XYZ High School</td></tr>
<tr><td><a href="/db/status.php?teacherid=5678">Teacher2</a></td><td>ABC School</td></tr>
<tr><td><a href="/db/status.php?teacherid=1111">Teacher3</a></td><td>International School</td></tr>

您需要格式化xpath字符串。

通過做

"//table/tbody/tr[i]/td/a"

實際上是tr[i]放入xpath,而不是tr[1]等,

代替

driver.find_element_by_xpath("//table/tbody/tr[i]/td/a").click()

x_path = "//table/tbody/tr[{0}]/td/a".format(i)
driver.find_element_by_xpath(x_path).click()

這取代了{1}與您的格式功能提供的價值字符串,所以在這種情況下,它會取代{1}12等,將讓您的XPath選擇按預期方式工作。

例:

search_result1 = sel.find_element_by_xpath("//a[not((//div[contains(@class,'s')]//div[contains(@class,'kv')]//cite)[1])]|((//div[contains(@class,'s')]//div[contains(@class,'kv')]//cite)[1])").text

search_result2 = sel.find_element_by_xpath("//a[not((//div[contains(@class,'s')]//div[contains(@class,'kv')]//cite)[2])]|((//div[contains(@class,'s')]//div[contains(@class,'kv')]//cite)[2])").text


search_results=[]
for i in range(1,11) #I am assuming 10 results in a page so you can set your own range
    result=sel.find_element_by_xpath("//a[not((//div[contains(@class,'s')]//div[contains(@class,'kv')]//cite)[%s])]|((//div[contains(@class,'s')]//div[contains(@class,'kv')]//cite)[%s])"%(i,i)).text
    search_results.append(result)

所以我修改了你的代碼

driver.find_element_by_xpath("//table/tbody/tr[%s]/td/a")%(i).click() 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM