背景
在selenium模拟网页操作时,由于网页加载和JS运行需要消耗一定的时间,可能会导致元素找不到而出现异常:
1 | 2019-03-18 16:05:21,108 - E:\Python\WorkSpace\firewall\fwConfigGetNew.py[line:80] - ERROR: Message: no such element |
思路
手工登陆下这个网址,看了下,打开之后会先出现一个loading
提示:
等loading
结束后才会出现对应的元素按钮:
那么就需要想办法延迟,来等待页面加载结束:
方法一: sleep
这是最简单直接的方法,在页面打开之后,增加一个sleep()
等待加载。因为这个时间很少会出现加载失败,超过时间仍未加载出来那就当做超时处理。
1 | sleep(5) |
方法二:WebDriverWait
这是selenium提供的等待方法,
1 | from selenium.webdriver.support.ui import WebDriverWait |
通过传入driver,并设置超时时间t,和循环检查时间p(默认为0.5秒),就可以实现每p秒检查一次是否已经存在对应的元素,一直到超时,存在该元素的话,返回元素。这种方式比较正规,相对方法一会节省一点时间,但其实原理类似。
该方法还需配合另外几个selenium包使用:
1 | from selenium.webdriver.support.ui import WebDriverWait |
总结
在使用selenium中,由于网络、浏览器、机器配置等因素,时不时就会发生找不到元素的问题,还是要注意多做一些异常处理,在可能涉及到等待的地方参考上述方法等待。如果可以直接使用request请求的话,那还是优先request请求获取相关数据。