首页 > 其他分享 >Pyppeteer && Selenium

Pyppeteer && Selenium

时间:2023-12-28 22:31:52浏览次数:22  
标签:web await Pyppeteer Selenium && import div page asyncio

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

相关文章

  • phantomjs selenium 如何动态修改代理?
    在使用PhantomJS和Selenium进行网页爬取时,动态修改代理可以通过使用Selenium的WebDriver的service_args参数来实现。以下是一个基本的示例,演示了如何在PhantomJS中动态修改代理:fromseleniumimportwebdriver#设置PhantomJS的可执行文件路径phantomjs_path='/......
  • 一个完整Python实战项目:selenium识别验证码实现自动登录,自动操作浏览器获取某东数据
    最近都没啥时间,很久没更新了。今天分享一下,如何用selenium识别验证码,实现自动登录以及获取数据。目标:某东话不多说直接开始准备工作环境Python3.10Pycharm模块使用importrandomimporttimefromseleniumimportwebdriverimportpyautoguii......
  • Selenium自动化之弹窗处理
    1.前言我们在使用Selenium做Web自动化测试时,页面经常出现弹窗,如果不处理后续的测试脚本就无法正常运行,今天我们就带大家一起来学习如何处理Web页面上的弹窗。2.Web页面弹窗的分类弹窗通常有3种:Alert类型弹框、Confirm类型弹框、Prompt类型弹框,这种我们无法通过定位元素来操作。......
  • Python+Selenium4自动化之JS属性
     应用场景在自动化中,能对JS代码进行增、删、改的话,可以帮助我们解决很多问题,如:修改<a>标签的target属性,让它不打开新的窗口(_blank),从而不用频繁使用switch_to进行窗口之间的切换。如:日期的输入框被锁定无法直接输入,需要点开日历控件后,从日历控件上点击日期,这时就可以删除......
  • 软件测试/测试开发|Python selenium CSS定位方法详解
    简介CSS选择器是一种用于选择HTML元素的模式。它允许我们根据元素的标签名、类名、ID、属性等属性进行选择。CSS选择器的语法简单而灵活,是前端开发中常用的定位元素的方式。selenium中的css定位,实际是通过css选择器来定位到具体元素,css选择器来自于css语法。CSS定位有以下显著......
  • Selenium的操作
    简介Selenium是广泛使用的模拟浏览器运行的库,它是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样,并且支持大多数现代Web浏览器。一、环境安装2.安装selenimum包pipinstallselenium2.安装浏览器驱动在官方下载EdgeDriverMicrosoftEd......
  • Linux CentOS7安装chrome和chromedriver,用于Selenium爬虫(java代码演示)
    ......
  • Python中selenium库的用法详解
    selenium主要是用来做自动化测试,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。模拟浏览器进行网页加载,当requests,urllib无法正常获取网页内容的时候一、声明浏览器对象注意点一,Python文件名或者包名不要命名为selenium,会导致无法导入fromseleniumimportwebdriver#web......
  • 软件测试/测试开发|selenium NoSuchDriverException问题解决
    前言我们在使用selenium进行web自动化测试时,有时候会遇到NoSuchDriverException的问题,这个异常通常是由于WebDriver无法找到指定的浏览器驱动而引起的。在这篇文章中,我们将讨论NoSuchDriverException的原因以及如何解决这个问题。NoSuchDriverException是什么?NoSuchDriverExce......
  • Selenium 爬虫
    frompixiv相关资料官网官网使用介绍可能会遇到的问题:selenium.common.exceptions.WebDriverException:Message:CannotconnecttotheServicechromedriver.exewhileopeningchromebrowser免责声明本人承诺在使用爬虫程序时,仅出于学习和个人技术提升的目的,以了解......