1. selenium冗长的错误提示
在selenium的使用过程中,会出现很多没有的信息,这些信息让控制台和日志文件的可读性降低了很多
比如chrome在运行过程中会时不时地出现这样地内容
DevTools listening on ws://127.0.0.1:50856/devtools/browser/a9396af4-3146-4164-96ba-208a966affbc
[24412:18772:0617/090708:ERROR:ssl_client_socket_openssl.cc(1158)] handshake failed; returned -1, SSL error code 1, net_error -100
[9848:10684:1201/013233.169:ERROR:device_event_log_impl.cc(211)] [01:32:33.170] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
[9848:10684:1201/013233.169:ERROR:device_event_log_impl.cc(211)] [01:32:33.170] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
像这样地内容已经在之前的版本精简掉了,
如果是使用webdriver-helper启动selenium的话,应该很久都没看到这些了。
这里只是为没有使用webdriver-helper的朋友说明一下
还有一部分内容,就是selenium的错误提示,非常的冗长
以一个最简单的代码为例,下面这个代码会再定位元素时失败
from selenium.webdriver.common.by import By
from webdriver_helper import get_webdriver
driver = get_webdriver() # 启动浏览器
driver.get("http://baidu.com")
driver.find_element(By.ID, "sanmu") # 元素定位失败
Chrome的错误如下
firefox的会稍微少一些,但一样烦琐
不管是chrome还是firefox,selenium报错时大部分的错误提示都是无用的,对我们来说真正价值的只有两行
-
哪一行代码引发错误? 在这个例子中是定位元素
driver.find_element(By.ID, "sanmu")
-
引发了什么错误?在这个例子中是元素不存在
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[id="sanmu"]"}
如果能够精简一下,不论是在控制台,还是在日志文件中,都可以极大的提高可读性
应粉丝要求,在webdriver_helper==2.3.1
中实现了这部分功能
2. webdriver-helper的精简效果
安装2.3.1及以上版本的webdriver_helper,同样的代码,提示是这样的
由图可知,优化后的错误提示,非常的短小、精悍,同时充分的展示了出错的位置、原因
3. 认识selenium中的错误提示
在python中,报错这个东西在专业术语上称为“异常”,
而上异常也分很多种,比如断言异常、文件异常、权限异常等等
在selenium中也定义了自用异常,比如元素定位失败时的NoSuchElementException
异常,就是selenium自己定义的
它和selenium中的其他异常一样,都属于同一个父类:WebDriverException
其源码如下
class WebDriverException(Exception):
def __init__(
self, msg: Optional[str] = None, screen: Optional[str] = None, stacktrace: Optional[Sequence[str]] = None
) -> None:
super().__init__()
self.msg = msg
self.screen = screen
self.stacktrace = stacktrace
def __str__(self) -> str:
exception_msg = f"Message: {self.msg}\n"
if self.screen:
exception_msg += "Screenshot: available via screen\n"
if self.stacktrace:
stacktrace = "\n".join(self.stacktrace)
exception_msg += f"Stacktrace:\n{stacktrace}"
return exception_msg
简单来说,selenium的异常就是接收msg
, screen
, stacktrace
,三个参数,再将他们拼接在一起,构成完整的错误提示
4. 其他改进
优化了pycharm的代码提示和自动补全,例如:
webdriver-helper系本人原创,欢迎关注