最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【无法解决】PyCharm中Selenium的WebElement变量后面失去了动态提示

PyCharm crifan 3667浏览 0评论

折腾:

【已解决】selenium的Python如何获取元素的文本

期间,对于之前一直可以动态提示和自动完成的变量,比如

from selenium import webdriver

driver = webdriver.Chrome()

driver后输入点,然后就可以显示出动态匹配,自动完成:

对应着,通过find_element_by_xpath等方法获取到的WebElement后,也是可以有动态提示的:

但是刚刚发现,此处:

driver后面和WebElement后面,都没了动态提示了:

即:输入priceSpanElement. 没有了之前的,动态提示,自动完成,没法看出有哪些属性和函数

后来才找到原因:

如果代码是直接导入后,接着用对应的变量的,是可以动态提示的

而如果是放到函数中:

def orderSingleMsStoreProduct(productInfoDict):

    global driver

    multipleXpathRule = ‘//div[@class=”price-text srv_price”]/span[@aria-label] | //div[@class=”price-text srv_price”]/div[contains(@class, “price-disclaimer”)]/span[@aria-label]’

    priceSpanElement = driver.find_element_by_xpath(multipleXpathRule)

PyCharm中貌似没法自动通过:

global driver

去解析到此处的driver就是前面的

driver = webdriver.Chrome()

得到的driver

所以就没法自动提示了。

对应从driver获取到的元素,也就没了自动完成。

pycharm variable inside function no auto complete

python – In Pycharm, global variables are not autocompleted inside functions when declared global for assignment – Stack Overflow

python – How to get PyCharm to auto-complete code in methods? – Stack Overflow

Type Hinting in PyCharm – Help | PyCharm

Type Hinting in PyCharm – Help | PyCharm

python – PyCharm autocomplete – Stack Overflow

@type conn: EC2Connection

是参数的写法啊,我这里是全局变量,不知道行不行,去试试

@type driver: WebDriver

结果好像不行。

不过对于参数来说,的确是可以的。

加之前:

加productInfoDict为dict:

之后:

此处以为是缺少了对应类型定义呢,所以去加上:

from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver

结果依旧没用。

pycharm global variable inside function no auto complete

pycharm global variable  no auto complete

PyCharm 96.176 Release Notes – PyCharm – Confluence

PY-833 (Bug) No autocomplete for class methods within a class method definition

先看看我此处的PyCharm的版本:

PyCharm 2016.3.3

Build #PY-163.15188.4, built on March 11, 2017

Licensed to imsxm.com

JRE: 1.8.0_112-release-408-b6 x86_64

JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o

之前96的版本就修复了,此处已经是163了,应该没此bug了才对

->

No autocomplete for class methods within a class method definition : PY-833

结果发现不是:全局变量的函数内无法自动完成 的bug。

python – In Pycharm, global variables are not autocompleted inside functions when declared global for assignment

为了能自动提示,此处可以考虑,把driver作为参数传递到函数内。

【总结】

然后测试了半天,结果是:

先说背景:

全局变量driver,PyCharm知道是WebDriver的类型了

(WebDriver完整的写法是:selenium.webdriver.remote.webdriver.WebDriver)

1.且和顶部的driver的初始化为None:

driver = None

没有关系

->

及时改为:

driver = webdriver.Chrome()

也不能让函数内的全局变量driver自动完成。

2.如果是driver当作参数传递进来

则函数的doc string中,无论是否添加:

@type driver: WebDriver

或:

@type driver: selenium.webdriver.remote.webdriver.WebDriver

则函数内部的driver都可以自动完成:

结论:

目前为了能让函数内部类型为WebDriver的全局变量driver能够自动完成,只能当作参数把函数外的,全局的driver,传递到函数内,则函数内的driver就可以自动完成了。

但是很明显这个是PyCharm的bug。

别人也提到过:

python – In Pycharm, global variables are not autocompleted inside functions when declared global for assignment – Stack Overflow

希望PyCharm尽快解决此bug。

【后记】

此处程序逻辑是是个全局的变量,所以不能每次都当作局部变量传递进去

否则函数内部操作的driver的变化,无法传递到全局的driver中,从而导致后续代码运行起来逻辑有问题,比如之前登录过了,后续却还要登录之类的。

所以:从程序逻辑角度来说,此处不能把driver设置为函数参数传递进来,就只能还是讲究,在没有自动完成的情况,继续用PyCharm写代码。

所以:还是只能等待PyCharm解决这个bug。

【后记2】

后来无意间通过:

“”“

中输入@t然后有个type和rtype:

然后经过一番继续折腾后发现:

<code>@type driver: selenium.webdriver.remote.webdriver
</code>

时,后续是可以检测出selenium的driver的,至少后面有希望看到的:WebDriver

再继续折腾,结果是:

<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver
</code>

或:

<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver
</code>

都可以识别参数的类型WebDriver

而另外的:

<code>@:rtype driver: selenium.webdriver.remote.webdriver
</code>

则好像没有影响。

【总结】

此处总之很是诡异的是:

用:

<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver
</code>

(或:

<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver
</code>

都)

可以成功让函数参数driver在后续的函数内,检测到变量类型为:

但是又发现,其实现象和之前一样:

如果加上

global driver

后,则无法动态提示(此处提示出来都是本文件内出现过的函数或字符串,不是库里面的):

所以目前结论是:

【总结】

作为全局变量的话,还是无法动态提示;

作为函数参数,可以用:

<code>@type driver: selenium.webdriver.remote.webdriver.WebDriver
@:type driver: selenium.webdriver.remote.webdriver.WebDriver
</code>

实现动态提示。

转载请注明:在路上 » 【无法解决】PyCharm中Selenium的WebElement变量后面失去了动态提示

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
82 queries in 0.174 seconds, using 22.12MB memory