Bootstrap

webdriver-helper又出新版:可精简selenium的错误信息

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报错时大部分的错误提示都是无用的,对我们来说真正价值的只有两行

  1. 哪一行代码引发错误? 在这个例子中是定位元素

     driver.find_element(By.ID, "sanmu")

  2. 引发了什么错误?在这个例子中是元素不存在

     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系本人原创,欢迎关注

;