2017-04-05 945 views
2

网页我试图自动化包含100多个链接(教师姓名)的列表,单击其中加载在该教师下注册的学生列表。我的任务是单击每个链接以确保学生信息加载(在同一页面上),单击浏览器后退按钮,单击第二个教师姓名等,直到最后一个链接(教师姓名)结束。循环查找xpath元素,然后单击找到的每个元素

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[2]tr[i](或括号内的任何整数值)时,它识别该元素并点击它。例如,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> 
+1

请格式化,以便您的代码显示为代码 – Gary99

回答

1

您需要格式化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}1,2等,并且会使您的xpath选择器按预期工作。

-1

例子:

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() 
+0

您的parens已搞砸了。删除'%'附近的文件:'driver.find_element_by_xpath(“// table/tbody/tr [%s]/td/a”%i).click()' –