Selenium找不到元素时如何从while(True)循环头部重新运行代码
元素不存在时Selenium程序报错终止的解决方法
问题场景
- 代码运行过程中因无法定位对应元素触发报错,直接终止程序
- 程序基于
while(True)循环持续检索预定义列表内容,要求元素不存在时直接回到循环开头执行下一次调用 - 最初的异常捕获代码执行后仍然会报错终止,代码如下:
wait.until(EC.visibility_of_element_located((By.XPATH,"//*[@id='ShipResultId']/table/tbody/tr[2]/td[1]/div[1]/div/a"))).click() try: ucgen = wait.until(EC.visibility_of_element_located((By.XPATH,"//*[@id='body']/div[6]/div/div/div/div/div/div/div[2]/a/div/div/div[2]/div/img"))) ucgen.click() except NoSuchElementException: driver.close()
原因说明
wait.until方法在等待元素超时时抛出的是TimeoutException,不是NoSuchElementException,所以原来的异常捕获分支不会被触发,程序会直接抛出异常终止。
解决方案
调整异常捕获逻辑,同时在捕获到异常后添加continue语句直接跳回while循环开头,修改后的代码如下:
wait.until(EC.visibility_of_element_located((By.XPATH,"//*[@id='ShipResultId']/table/tbody/tr[2]/td[1]/div[1]/div/a"))).click() try: ucgen = wait.until(EC.visibility_of_element_located((By.XPATH,"//*[@id='body']/div[6]/div/div/div/div/div/div/div[2]/a/div/div/div[2]/div/img"))) ucgen.click() # 可根据需要补充捕获其他可能的异常 except (NoSuchElementException, TimeoutException): driver.close() continue
遇到同类问题的用户可以在异常处理分支中添加以下两行代码实现跳转回循环开头的效果:
driver.close() continue
内容的提问来源于stack exchange,提问作者E.MRZ
相关产品推荐
相关产品推荐

