在Python IDLE 中输入from selenium import webdriver就会报错

在Python IDLE 中输入from selenium import webdriver就会报错
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
from selenium import webdriver
ImportError: cannot import name webdriver

怎么破,求大神指点

在当前目录有名叫selenium的文件,Python会先导入这个文件,然后再导入标准库里面的selenium.py。

可以使用
import selenium
print selenium.__file__

去看打印出的文件路径,如果不是类型下面的地址C:\Python27\lib\site-packages\selenium-2.31.0-py2.7.egg\selenium\__init__.pyc,需要把当前目录下的名叫selenium文件删除或者重命名。

WebDriver原理分析

WebDriver与之前Selenium的JS注入实现不同,直接利用了浏览器native support来操作浏览器。所以对于不同平台,不同的浏览器,必须依赖一个特定的浏览器的native component来实现把WebDriver API的调用转化为浏览器的native invoke。

在我们new一个WebDriver的过程中,Selenium首先会确认浏览器的native component是否存在可用而且版本匹配。接着就在目标浏览器里启动一整套Web Service,这套Web Service使用了Selenium自己设计定义的协议,名字叫做 The WebDriver Wire Protocol 。这套协议非常之强大,几乎可以操作浏览器做任何事情,包括打开、关闭、最大化、最小化、元素定位、元素点击、上传文件等等。

WebDriver Wire协议是通用的,也就是说不管是FirefoxDriver还是ChromeDriver,启动之后都会在某一个端口启动基于这套协议的Web Service。例如FirefoxDriver初始化成功之后,默认会从http://localhost:7055开始,而ChromeDriver则大概是http://localhost:46350之类的。接下来,我们调用WebDriver的任何API,都需要借助一个ComandExecutor发送一个命令,实际上是一个HTTP request给监听端口上的Web Service。在我们的HTTP request的body中,会以WebDriver Wire协议规定的JSON格式的字符串来告诉Selenium我们希望浏览器接下来做社么事情。

这里笔者初步画了一个图来表示各种WebDriver的工作原理: 

从上图中我们可以看出,不同浏览器的WebDriver子类,都需要依赖特定的浏览器原生组件,例如Firefox就需要一个add-on名字叫webdriver.xpi。而IE的话就需要用到一个dll文件来转化Web Service的命令为浏览器native的调用。另外,图中还标明了WebDriver Wire协议是一套基于RESTful的web service。如果不明白什么是RESTful的,可以参见笔者之前另外一篇介绍REST的blog( http://blog.csdn.net/ant_yan/article/details/7963517 )。

关于WebDriver Wire协议的细节,比如希望了解这套Web Service能够做哪些事情,可以阅读Selenium官方的 协议文档 , 在Selenium的源码中,我们可以找到一个HttpCommandExecutor这个类,里面维护了一个Map。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-05-06
在当前目录有名叫selenium的文件,Python会先导入这个文件,然后再导入标准库里面的selenium.py。

可以使用
import selenium
print selenium.__file__

去看打印出的文件路径,如果不是类型下面的地址C:\Python27\lib\site-packages\selenium-2.31.0-py2.7.egg\selenium\__init__.pyc,需要把当前目录下的名叫selenium文件删除或者重命名本回答被网友采纳
第2个回答  2015-05-05
你安装selenium了?
相似回答