Python3.8 Walrus Operator搭配not赋值元组时Selenium语法错误求解
问题原因与解决方案
报错根因
- 语法错误直接原因:Python的赋值表达式(海象运算符
:=)不支持直接对多个变量组成的元组进行批量赋值 - 隐藏逻辑错误:
selectElement方法返回的是(元素对象, 选择器类型)的元组,元组本身没有is_displayed()方法,直接调用会触发属性错误 - 逻辑漏洞:你原代码中试图将
not xxx.is_displayed()返回的布尔值赋值给元组,本身也不符合语法规则
修复方案
你完全不需要额外拆分函数或者重复执行代码,只需要调整findAndCheckIfVisible的逻辑即可,以下是两种可行写法:
写法1:易读的常规写法(推荐)
先接收selectElement的返回值再判断可见性,全程只调用一次selectElement:
def findAndCheckIfVisible(self, selector): element, selector_type = self.selectElement(selector) if not element.is_displayed(): selector_value = selector.split("=", 1)[1] raise ElementFoundButNotVisible(selector_value, selector_type)
写法2:保留赋值表达式的写法
如果一定要用海象运算符,只需要先把返回值赋值给单个变量再拆分即可:
def findAndCheckIfVisible(self, selector): if not (select_res := self.selectElement(selector))[0].is_displayed(): selector_value = selector.split("=", 1)[1] raise ElementFoundButNotVisible(selector_value, select_res[1])
额外优化建议
你当前拆分选择器的逻辑selector.split("=")没有限制拆分次数,如果选择器值中包含等号(比如XPath表达式、带等号的链接文本)会拆分错误,建议修改selectElement里的拆分逻辑:
# 只拆分第一个等号,避免值中包含等号导致的错误 selector_type, selector_value = selector.split("=", 1)
如果不想在抛异常的时候重复拆分选择器,也可以修改selectElement的返回值,额外返回选择器值:
# 把原return语句修改为 return element, selector_type, selector_value
后续使用时直接接收三个返回值即可,不需要二次拆分。
内容的提问来源于stack exchange,提问作者Jocomol
相关产品推荐
相关产品推荐

