我试图自动化的网页包含一个包含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()
工作得很好。不知道为什么通过tr
(在i
循环中)将整数值传递给for
不起作用?
HTML code:
<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>
答案 0 :(得分: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()
DO
x_path = "//table/tbody/tr[{0}]/td/a".format(i)
driver.find_element_by_xpath(x_path).click()
这会将字符串中的{1}
替换为您在格式函数中提供的值,因此在这种情况下,它会将{1}
替换为1
,2
等。并将使您的xpath选择器按预期工作。
答案 1 :(得分:-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()