为什么选python?
之前的菜鸟系列是基于java的,一年没学其实也忘的差不多了,目前所测的产品部分也是python写的,而且团队也在推广python ,其实就测试人员来说,python也相当受欢迎。易学,易用。翻翻各测试招聘,python出现的概率也颇高。
平台搭建:
前一篇中已经介绍,如果你也想体验一下自动化魅力,那就赶快搭建自己的环境吧~!
selenium + python自动化测试环境搭建
第一个脚本:
下面看看python 穿上selenium webdriver 是多么的性感:
# coding = utf-8
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
browser.quit()
怎么样?相信不懂代码的人都能看懂,但还是请容我在这里啰嗦一下每一句的含义:
# coding = utf-8
可加可不加,开发人员喜欢加一下,防止乱码嘛。
from selenium import webdriver
要想使用selenium的webdriver 里的函数,首先把包导进来嘛
browser = webdriver.Firefox()
我们需要操控哪个浏览器呢?Firefox ,当然也可以换成Ie 或 Chrome 。browser可以随便取,但后面要用它操纵各种函数执行。
browser.find_element_by_id("kw").send_keys("selenium")
一个控件有若干属性id 、name、(也可以用其它方式定位),百度输入框的id 叫kw ,我要在输入框里输入 selenium 。多自然语言呀!
browser.find_element_by_id("su").click()
搜索的按钮的id 叫su ,我需要点一下按钮( click() )。
browser.quit()
退出并关闭窗口的每一个相关的驱动程序,它还有个类似的表弟。
browser.close()
关闭当前窗口 ,用哪个看你的需求了。
添加休眠
什么?你说刚才太快没看清浏览器的操作过程。请time出马,让他跑慢点。
# coding = utf-8
from selenium import webdriver
import time #调入time函数
browser = webdriver.Firefox()
browser.get("http://www.baidu.com")
time.sleep(0.3) #休眠0.3秒
browser.find_element_by_id("kw").send_keys("selenium")
browser.find_element_by_id("su").click()
time.sleep(3) # 休眠3秒
browser.quit()
time.sleep() 函数随意插,哪里太快插哪里,再也不用担心看不清脚本的运行过程了。
其实,这个函数的真正用途不是给我们看脚本的运行过程的,有时候网络原因,或页面加载慢。假设搜索框输入框输入了selenium ,搜索按钮还没加载出来,那么脚本就报错。在适当的位置加入time.sleep()有助于减少网络原因造成的脚本执行失败;
输出
什么?在运行脚本的时候,上了个厕所,你都不知道刚才的脚本是否运行成功了。把刚才访问页面的title 打印出来。
# coding = utf-8
from selenium import webdriver
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
print driver.title # 把页面title 打印出来
driver.quit()
虽然我没看到脚本的执行过程,但我在执行结果里看到了
>>>
百度一下,你就知道
说明页面正确被我打开了。
--------------------------
学习更多selenium 内容:
#1楼 bubu_步步 2013-07-17 10:05
很喜欢博主的文章,刚刚用豆约翰博客备份专家备份了您的全部博文。
#2楼 qunqun 2013-08-13 13:39
如何搭建selenium+webdriver 环境啊
#3楼 花海子 2014-07-09 16:37
browser.find_element_by_id("kw").send_keys("selenium") 这句话运行报如下错误
selenium.common.exceptions.ElementNotVisibleException: Message: u'Element is not currently visible and so may not be interacted with' ; Stacktrace:
请教一下这是什么情况啊? 谢谢
#4楼 Free-program 2014-07-15 11:45
@ 花海子
你得把id改成kw1----自己去定位对象id,别搬代码
#5楼 Frankwangyifang 2015-03-27 18:09
@虫师,你好,请问下,如何通过自己写代码来调用Selenium2Library的封装的方法呀?
比如,我要封装新的Keyword的时候,希望能用到Selenium2Library里的方法(e:Open Browser),要怎么处理呢?
谢谢!
#6楼 林中夕阳 2016-02-01 12:55
browser.quit()关闭浏览器时提示,Plugin container for Firefox已停止工作,什么原因啊,网上的答案都不行
#7楼 duck2790 2016-04-13 15:55
请教一下:为什么没次打开Firefox都报错呢?
if count == 30:
self.kill()
raise WebDriverException("Can't load the profile. Profile "
"Dir: %s If you specified a log_file in the "
"FirefoxBinary constructor, check it for details."
% (self.profile.path))
就是加粗的部分报错了,好像是启动的时候没加载浏览器配置文件。
我是mac,怎么加载他的配置文件呢?
跪等回复。
#8楼 844649600 2016-07-13 15:17
非常好
#9楼 lorie 2016-07-13 17:02
你好,请问输出函数不要加括号吗,不应该是print(driver.title)吗?
#10楼 victorlw 2016-07-15 17:58
赞!开始学习,虫师的博客相见恨晚,如果早两年看到就好了。
#11楼 twuv 2016-08-18 11:42
@ lorie
这个是用python 2.x的版本写的,python3.x后变为print()
#12楼 twuv 2016-08-18 11:43
@ 虫师 你好,我的报这个错是为什么啊
#13楼 twuv 2016-08-18 11:43
Traceback (most recent call last):
File "E:/Dev_Root/python/how_to_dev_python/WebTest/test1.py", line 5, in <module>
browser = webdriver.Firefox()
File "C:\Python27\lib\site-packages\selenium-3.0.0b1-py2.7.egg\selenium\webdriver\firefox\webdriver.py", line 65, in __init__
self.service.start()
File "C:\Python27\lib\site-packages\selenium-3.0.0b1-py2.7.egg\selenium\webdriver\common\service.py", line 71, in start
os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to be in PATH.
Exception AttributeError: "'Service' object has no attribute 'process'" in <bound method Service.__del__ of <selenium.webdriver.firefox.service.Service object at 0x02996C30>> ignored
#14楼 还没有 2016-09-18 21:51
你好,看了你的例子。
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.163.com')
print(browser.title)
browser.quit()
没有任何结果。是不是firefox还要配置什么的
我改成IE,就出错了
Traceback (most recent call last):
File "C:/Users/ty/PycharmProjects/untitled3/src/Reptile.py", line 17, in <module>
browser = webdriver.Ie()
File "E:\Python\Python35-32\lib\site-packages\selenium-2.21.2-py3.5.egg\selenium\webdriver\ie\webdriver.py", line 58, in __init__
desired_capabilities=DesiredCapabilities.INTERNETEXPLORER)
File "E:\Python\Python35-32\lib\site-packages\selenium-2.21.2-py3.5.egg\selenium\webdriver\remote\webdriver.py", line 60, in __init__
self.start_session(desired_capabilities, browser_profile)
File "E:\Python\Python35-32\lib\site-packages\selenium-2.21.2-py3.5.egg\selenium\webdriver\remote\webdriver.py", line 102, in start_session
'desiredCapabilities': desired_capabilities,
File "E:\Python\Python35-32\lib\site-packages\selenium-2.21.2-py3.5.egg\selenium\webdriver\remote\webdriver.py", line 151, in execute
response = self.command_executor.execute(driver_command, params)
File "E:\Python\Python35-32\lib\site-packages\selenium-2.21.2-py3.5.egg\selenium\webdriver\remote\remote_connection.py", line 283, in execute
return self._request(url, method=command_info[0], data=data)
File "E:\Python\Python35-32\lib\site-packages\selenium-2.21.2-py3.5.egg\selenium\webdriver\remote\remote_connection.py", line 324, in _request
response = opener.open(request)
File "E:\Python\Python35-32\lib\urllib\request.py", line 464, in open
req = meth(req)
File "E:\Python\Python35-32\lib\urllib\request.py", line 1183, in do_request_
raise TypeError(msg)
TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.
这是什么原因??
#15楼 北倍 2016-11-03 15:08
@ twuv
我遇到了和你一样的情况,请问你解决了吗?
#16楼 多米尼哥 2016-11-16 16:12
@ 北倍
这是因为在Firefox高版本需要使用 geckodriver 来驱动,不再使用Seleniu默认自带的Firefox webdriver。
你需要手动下载 geckodriver 并将 其所在的路径设为环境变量即可解决(或者把geckodriver.exe扔到python安装目录下,跟python.exe同级目录)。
#17楼 北倍 2016-11-17 17:02
@ 多米尼哥
谢谢你解答了我的疑惑,我后来用了谷歌,装了chromedriver.
#18楼 我是快乐的小黄鸭 2016-12-04 16:56
已精下载了geckodriver放在了C:\Program Files (x86)\Mozilla Firefox 路径下。环境变量:C:\Program Files (x86)\Mozilla Firefox;D:\setup_root\python;
我的系统是:win 7 64位。firefox也是最新的版本。
运行脚本时提示:
[Child 22664] ###!!! ABORT: Aborting on channel error.: file c:/builds/moz2_slave/m-rel-w32-00000000000000000000/build/src/ipc/glue/MessageChannel.cpp, line 2056
多方查找,没有找到解决方法~~
#19楼 我是快乐的小黄鸭 2016-12-04 17:00
补充:python是2.7 版本。
D:\setup_root\python\python.exe E:/pycharm_code/test/uitest.py
hello
'NoneType' object has no attribute 'path'
Process finished with exit code 0
#20楼 哼哼唧唧pl 2016-12-19 13:37
@ lorie
不用加driver啊
#21楼 test_engineer 2017-05-16 20:33
# coding=utf-8
from selenium import webdriver
driver = webdriver.Ie()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("Selenium2")
driver.find_element_by_id("su").click()
driver.quit()
代码执行之后,启动了Ie浏览器并获取了百度首页,之后的三行代码没有执行,这是为什么?
错误提示:
raceback (most recent call last):
File "E:\课程\《Python》\code\webdirver\baidu.py", line 9, in <module>
driver.find_element_by_id("kw").send_keys("Selenium2")
File "C:\Users\jian\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 285, in find_element_by_id
return self.find_element(by=By.ID, value=id_)
File "C:\Users\jian\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 787, in find_element
'value': value})['value']
File "C:\Users\jian\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 252, in execute
self.error_handler.check_response(response)
File "C:\Users\jian\AppData\Local\Programs\Python\Python35-32\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 194, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: Unable to find element with id == kw