Selenium是一个开源、免费、简单、灵活,对Web浏览器支持良好的自动化测试工具,在UI自动化、爬虫等场景下是十分实用的,能够熟练掌握并使用Selenium工具可以大大的提高效率。
Selenium简介
Selenium支持多平台、多浏览器、多语言去实现自动化测试,是一个开源和可移植的Web测试框架,支持并行测试执行,从而减少了时间并提高了测试效率。利用它,我们可以编写相关的自动化程序,让程序完全像人一样在浏览器里面操作Web界面,比如模拟鼠标点击、模拟键盘输入等等。不但能够操作Web界面,还能从Web中获取信息,并且相对来说,使用Selenium来获取信息更加简单,它的基本原理是我们编写自动化程序之后利用浏览器驱动直接对浏览器进行操作,只要我们用户能在浏览器上获得的信息使用Selenium都可以获得。
范例:
京东搜索手表:
from selenium.webdriver import Chrome
from selenium.webdriver.common.keys import Keys
import time
web = Chrome()
web.get('https://www.jd.com')
#搜索
time.sleep(1)
web.find_element('xpath', '//*[@id="key"]').send_keys("佳明手表", Keys.ENTER)
time.sleep(2)
动作链:
import time
from selenium.webdriver import ActionChains
from selenium import webdriver
from selenium.webdriver.common.by import By
web = webdriver.Chrome()
web.maximize_window()
web.get('http://sahitest.com/demo/dragDropMooTools.htm')
dragger = web.find_element(By.ID, 'dragger')
item1 = web.find_element(By.XPATH, '//div[text()="Item 1"]')
item2 = web.find_element(By.XPATH, '//div[text()="Item 2"]')
item3 = web.find_element(By.XPATH, '//div[text()="Item 3"]')
action = ActionChains(web)
action.drag_and_drop(dragger, item1).perform() # 1.移动dragger到目标1
time.sleep(2)
action.click_and_hold(dragger).release(item2).perform() # 2.效果与上句相同,也能起到移动效果
time.sleep(2)
action.click_and_hold(dragger).move_to_element(item3).release().perform() # 3.效果与上两句相同,也能起到移动的效果
time.sleep(2)
action.click_and_hold(dragger).move_by_offset(800, 0).release().perform()
time.sleep(2)
web.quit()
js代码执行例子:
import time
from selenium import webdriver
web = webdriver.Chrome()
web.get("https://movie.douban.com/top250?start=25a")
web.execute_script("window.scrollTo(0,document.body.scrollHeight)")
time.sleep(5)
无头浏览的例子:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
opt = Options()
opt.add_argument("--headless")
# opt.add_argument("--windows-size=4500, 1800")#设置窗口大小
web = webdriver.Chrome(options=opt)
web.get("https://movie.douban.com/top250?start=25a")
img_url = web.find_element(By.XPATH, '//*[@id="content"]/div/div[1]/ol/li[2]/div/div[1]/a/img')
print(img_url.get_attribute('src'))
Pyppeteer
Chromium 是谷歌为了研发 Chrome 而启动的项目,是完全开源的。二者基于相同的源代码构建,Chrome 所有的新功能都会先在 Chromium 上实现,待验证稳定后才会移植,因此 Chromium 的版本更新频率更高,也会包含很多新的功能,但作为一款独立的浏览器,Chromium 的用户群体要小众得多。两款浏览器“同根同源”,它们有着同样的 Logo,但配色不同,Chrome 由蓝红绿黄四种颜色组成,而 Chromium 由不同深度的蓝色构成。Pyppeteer 是基于 Python 的新特性 async 实现的,所以它的一些执行也支持异步操作,效率相对于 Selenium 来说也提高了
安装
pip install pyppeteer
简单的入门例子
import asyncio
from lxml import etree
from pyppeteer import launch
async def run():
# 创建浏览器对象
bro = await launch(headless=True)
# 创建新页面
page = await bro.newPage()
#发起请求
await page.goto("https://sports.163.com/")
page_text = await page.content()
tree = etree.HTML(page_text)
name_list = tree.xpath('//*[@id="index2016_wrap"]/div[3]/div[2]/div[2]/ul/li[@class="first_menu"]/a/text()')
print("content is ", name_list)
await asyncio.sleep(1)
await bro.close()
target = run()
loop = asyncio.get_event_loop()
loop.run_until_complete(target)
相关参数:
- ignoreHTTPSErrors (bool): 是否要忽略 HTTPS 的错误,默认是 False。
- headless (bool): 是否启用 Headless 模式,即无界面模式,默认是开启无界面模式的。如果设置为 False则是有界面模式。
- executablePath (str): 可执行文件的路径,如果指定之后就不需要使用默认的 Chromium 了,可以指定为已有的 Chrome 或 Chromium。
- devtools (bool): 是否为每一个页面自动开启调试工具(浏览器开发者工具),默认是 False。如果这个参数设置为 True,那么 headless 默认参数就会无效,会被强制设置为 False。
- args (List[str]): 在执行过程中可以传入的额外参数。
浏览器访问首页
import asyncio
from pyppeteer import launch
#进行长宽高设置
width, height = 1366, 768
async def main():
browser = await launch(headless=False)
page = await browser.newPage()
await page.setViewport({'width': width, 'height': height})
await page.goto('https://www.taobao.com')
await asyncio.sleep(3)
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
规避检测:执行js程序执行指定的js程序
import asyncio
from pyppeteer import launch
width, height = 1366, 768
async def main():
#规避检测
browser = await launch(headless=False, args=['--disable-infobars'])
page = await browser.newPage()
await page.setViewport({'width': width, 'height': height})
await page.goto('https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com%2F')
#规避检测
await page.evaluate(
'''() =>{ Object.defineProperties(navigator,{ webdriver:{ get: () => false } }) }''')
await asyncio.sleep(20)
await browser.close()
asyncio.get_event_loop().run_until_complete(main())
爬取网易新闻:
import asyncio
from pyppeteer import launch
from lxml import etree
async def main():
# headless参数设为False,则变成有头模式
browser = await launch(
headless=False,
#可在浏览器中输入chrome://version/,在页面的"个人资料路径"查看浏览器的执行程序
executablePath='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome'
)
page = await browser.newPage()
await page.goto('https://news.163.com/domestic/')
await asyncio.sleep(3)
# 打印页面文本
page_text = await page.content()
return page_text
def parse(task):
page_text = task.result()
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@class="data_row news_article clearfix "]')
for div in div_list:
title = div.xpath('.//div[@class="news_title"]/h3/a/text()')[0]
print('wangyi:', title)
tasks = []
task1 = asyncio.ensure_future(main())
task1.add_done_callback(parse)
tasks.append(task1)
asyncio.get_event_loop().run_until_complete(asyncio.wait(tasks))
标签:web,await,Pyppeteer,Selenium,&&,import,div,page,asyncio
From: https://blog.51cto.com/u_16172166/9019067