【问题标题】:Selenium clicking loop ignored some valuesSelenium 点击循环忽略了一些值
【发布时间】:2020-11-04 13:30:15
【问题描述】:
我正在尝试运行代码:
for j in range(1,13):
driver.find_element_by_xpath('//*[@id="gateway-page"]/body/table/tbody/tr[3]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr/td/table/tbody/tr[2]/td/div/div[2]/ul/li['+str(j)+']').click()
time.sleep(3)
点击website 上的每一个令人满意的元素。但是它每次都会忽略一些元素,而当我不是在 for 循环中而是单独尝试它们时它就起作用了。知道为什么会这样吗?
【问题讨论】:
标签:
python-3.x
selenium
automated-tests
【解决方案1】:
似乎问题在于/ul/li['+str(j)+'] 您正在执行点击<li> 标签,而实际链接位于其中。这就是为什么有时实际链接不会在没有任何错误的情况下收到点击,因为链接包含在 <li> 标记中。
尝试找到实际的链接标签。使用下面的代码。我已经在我的系统上进行了测试。希望这会对你有所帮助。
driver.get('http://catalog.sps.cuny.edu/preview_program.php?catoid=2&poid=607')
driver.implicitly_wait(10)
links = driver.find_elements_by_xpath("//div//h2[contains(.,'Electives')]/..//ul/li//span/a")
for link in links:
link.click()
time.sleep(3)
【解决方案2】:
观察 xpath 后,我观察到您正在尝试单击该网站上的 Elective 选项。我认为您已将所有选修课的文本存储在 str 数组中,并使用循环,您试图点击每个选修课。
我建议使用另一种方法。将所有选修课存储在列表中,然后遍历元素并单击它们。例如
elements = driver.find_elements_by_xpath('///*[@id="gateway-page"]/body/table/tbody/tr[3]/td[2]/table/tbody/tr[2]/td[2]/table/tbody/tr/td/table/tbody/tr[2]/td/div/div[2]/ul/li')
for element in elements:
element.click()
time.sleep()
您的解决方案中可能存在的问题
- 您将选修课的名称存储在数组中。如果有任何拼写错误,xPath 将失效
- 您从 1 到 13 开始循环,但 str 的索引为 0,所以从 0 开始循环。因为在这种情况下,您总是会错过第一门选修课
- 每次点击后,选修课也会展开。因此,如果找不到元素,您也可以考虑滚动
建议:
另外,使用相对 xpaths 而不是绝对路径。相对 xpath 更稳定。
编码愉快~