from selenium import webdriver
btn = None
def a():
global btn
driver = webdriver.Chrome()
driver.get(url)
btn = driver.find_element_by_css_selector('XXX')
def b():
btn...
在 a 里 给 btn 声明了全局变量。
在 b 里不能用。打 btn. 点后不出来 find_element_XXX 那些提示
然后在 上面加了 btn = None 也不行(我也不知道 find_element_by_XXX 声明什么类型就打了 None)
是为什么?
a 方法都没有运行过,没法将 btn 重新赋值的;
你这种样式不实用;
from selenium import webdriver
def a():
global btn
driver = webdriver.Chrome()
driver.get(url)
btn = driver.find_element_by_css_selector('XXX')
return btn
btn = a()
def b():
btn...
pycharm 没那么聪明
b 函数没有 global?
正常的,因为上面代码是 btn 和方法处于同一个级别作用域,大白话来说,对象管理只有下个级别的可以访问上个级别的。
如楼上所说需要把 btn 加一个关键字 global,来标记 btn 是当前文件内全局可以访问的,btn 泛指在堆上的,不同方法之间不共享。
推荐用类来写。
加了 global 也一样的。
btn 需要在多个函数里调用。所以想定义成全局。
return 的话,其它函数用 btn 都跑一遍 a() 没必要。
class 会好点,但已经写完了,只是日常修改,不想在折腾类了,改起来太多
没问题啊
个人理解:
这种应该只和 python 版本相关,这是编译器的内容。
IDE 不会起决定作用。
btn 是 webelement 类型。是 driver.find_element_by_css_selector('XXX') 返回的元素对像,不是字符串。
在 b 里不能用。打 btn. 点后不出来 find_element_XXX 那些提示
这没问题吧?btn 又不是 driver 类型,而是 web element 类型。这个类型下面没有 find_element_XXX 这些方法,所以不出现提示很正常呀。
PS:pycharm 不是万能的,有些运行时赋值的东西它不一定都能识别得到,最典型的是通过反射赋值的基本都识别不出来。不能说没有自动提示就认为不能使用,只要程序能跑没问题,就可以了。
PPS:这种在某个函数内突然声明一个 global 变量的写法,demo 写下还可以,正式程序不建议这么写,会非常难找。
找到原因了,你们都错了。。。已解决!!!