python+selenium自动化软件测试(第6章):selenium phantomjs页面解析使用
我们都知道Selenium是一个Web的自动化测试工具,可以在多平台下操作多种浏览器进行各种动作,比如运行浏览器,访问页面,点击按钮,提交表单,浏览器窗口调整,鼠标右键和拖放动作,下拉框和对话框处理等,我们抓取时选用它,主要是Selenium可以渲染页面,运行页面中的JS,以及其点击按钮,提交表单等操作。
from selenium import webdriver driver = webdriver.PhantomJS() driver.get("http://www.xxxxxx.com") data = driver.title print data
我们为什么要用phantomjs呢?
介绍
PhantomJS是一个基于webkit的JavaScript API。任何你可以在基于webkit浏览器做的事情,它都能做到。它不仅是个隐形的浏览器(没有UI界面的浏览器),提供了诸如CSS选择器、支持Web标准、DOM操作、JSON、HTML5、Canvas、SVG等,同时也提供了处理文件I/O的操作,从而使你可以向操作系统读写文件等。PhantomJS的用处可谓非常广泛,诸如前端无界面自动化测试(需要结合Jasmin)、网络监测、网页截屏等。
windows下进行安装:
pip install selenium
phantomjs使用简单的使用方式:
from selenium import webdriver browser = webdriver.PhantomDS('D:\phantomjs.exe') #浏览器初始化;Win下需要设置phantomjs路径,linux下置空即可 url = 'http://www.xxxxxx.com' # 设置访问路径地址 browser.get(url) # 打开网页 title = browser.find_elements_by_xpath('xxxxxx') #用xpath获取元素 for t in title: # 遍历输出 print t.text #输出其中文本 print t.get_attribute(’class’)# 输出属性值 browser.qiiit() #关闭浏览器。当出现异常时记得在任务浏览器中关闭
我们进行一个简单的对比操作,首先请回顾一下selenium webdriver的操作
from selenium import webdriver driver = webdriver.Firefox() driver.get("https: //www.xxxxxx.com/") dniver.find_element_by_id('xxxxxxxx').send_keys("nxxxxxx") dniver.find_element_by_id("xxxxxxxx").click() driver.quit()
使用phantomjs
from selenium import webdriver driver = webdriver.PhantomJS() driver.set_window_size(xxx,xxx) #浏览器大小 driver.get ("https: //www.xxx.com/") dniver.find_element_by_id('xxxx').send_keys("xxxx") dniver.find_element_by_id("xxxxxx").click() print driver.current_url driver.quit()
通过以上两个案例大家应该可以看出相关的一个区别所在!!
编写一个简单的断言来判断phantomjs获取得到的URL是否正确的呢:
import unittest from selenium import webdriver class TestOne(unittest.TestCase): def setUp(self): self.driver = webdniver.PhantomDS() self.driver.set_window_size(xxx, xxx) def test_url(self): self.driver.get("https://www.xxx.com") self.driver.find_element_by_id('xxxxxx').send_keys("xxxx") self.driver.find_element_by_id("xxxxx").click() self.assentln("https://www.xxx.com", self.driver.current_url) def tearDown(self): self.driver.quit() if __name__ == "__main__": unittest.main()
那么你会发现通过以上的单元测试进行断言后是完全可以通过的。
使用PhantomJS在浏览器的一个主要优点是测试通常要快得多。
import unittest from selenium import webdriver import time class TestThree(unittest.TestCase): def setUp(self): self.startTime = time.time() def test_unl_fire(self): time.sleep(2) self.driver = webdniver.Firefox() self.driver.get("https://www.xxx.com") button = self.driver.find_element_by_id("xxx").get_attribute("xxxx") self.assentEquals('xxxxx', button) def test_unl_phantom(self): time.sleep(l) self.driver = webdniver.PhantomDS() self.driver.get("https://www.xxx.com") button = self.driver.find_element_by_id("xxxx").get_attribute("xxxx") self.assentEquals('xxxxx', button) def tearDown(self): t = time.time() - self.startTime print "%s: %.3f"% (self.id(), t) self.driver.quit() if __name__== '__main__': suite = unittest.TestLoader().loadTestsFromTestCase(TestThree) unittest.TextTestRunner(verbosity=0).run(suite)
通过两个时间上的一个对比你会发现使用phantomjs速度有多快
内容拓展:
# coding:utf-8 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ec import nose.tools as nose #帐户 email = 'user' password = 'password' # phantomjs # user agent user_agent = 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.66 Safari/537.36' # PhantomUS的路径 pjs_path = 'xx/node_modules/phantomjs/bin/phantomjs dcap = {"phantomjs.page.settings.userAgent": user_agent, 'marionette' : True } driver = webdriver.PhantomJS(executable_path=pjs_path, desired_capabilities=dcap) # 5秒 wait = WebDriverWait(driver, 5) #获取html登录页面 login_page_url = 'http://xxx' driver.get(login_page_url) #等到页面加载 wait.until(ec.presence_of_all_elements_located) #检查当前网址 nose.eq_('http://xxx', driver.current_url) # login # button click show_signin = driver.find_element_by_id('xxx') show_signin.click() # email login_xpath = 'xxx"]' #等待对象元素 wait.until(ec.visibility_of_element_located((By.XPATH, login_xpath))) login_id_form =driver.find_element_by_xpath(login_xpath) login_id_form.clean() login_id_form.send_keys(email) # password password_xpath = 'xxxx' #等待对象元素 wait.until(ec.visibility_of_element_located((By.XPATH, password_xpath))) # password password_form = driver.find_element_by_xpath(passwond_xpath) password_form.clean() password_form.send_keys(password) # submit submit_xpath = 'xxxx' dniver.find_element_by_xpath(submit_xpath).click() # result driver.get('http://xxx') #等到页面加载 wait.until(ec.presence_of_all_elements_located) #检查当前网址 nose.eq_('http://xxx', driver.current_url) user_email = driver.find_element_by_xpath('xxx').get_attribute( "XXX") nose.eq_(email, user_email)