【问题标题】:Looping through to find element by xpath and then click on each element found循环通过 xpath 查找元素,然后单击找到的每个元素
【发布时间】:2017-04-07 21:53:14
【问题描述】:

我正在尝试自动化的网页包含 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>

【问题讨论】:

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

标签: python selenium


【解决方案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} 替换为您在格式函数中提供的值,因此在这种情况下,它将用12 等替换{1},并使您的xpath 选择器作为预计。

【讨论】:

    【解决方案2】:

    例子:

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

    【讨论】:

    • 你的括号搞砸了。删除%周围的那些:driver.find_element_by_xpath("//table/tbody/tr[%s]/td/a"%i).click()
    猜你喜欢
    • 1970-01-01
    • 2022-07-05
    • 2020-05-03
    • 1970-01-01
    • 2020-07-20
    • 2016-03-12
    • 2017-09-14
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多