av素人天堂_free性亚洲_久久亚洲国产视频_国产网红在线_午夜av在线播放_欧美成人精品福利网站_热99在线观看_国产在线观看免费麻豆_日本高清在线观看_亚洲免费网站观看视频

使用puppeteer實(shí)現(xiàn)瀏覽器自動化

Puppeteer 是一個(gè) Node 庫,它提供了一個(gè)高級 API 來通過 DevTools 協(xié)議控制 Chromium 或 Chrome。Puppeteer 默認(rèn)以 headless 模式運(yùn)行,但是可以通過修改配置文件運(yùn)行“有頭”模式。

可以實(shí)現(xiàn)手動操作瀏覽器的所有功能

 

生成頁面 PDF。
抓取 SPA(單頁應(yīng)用)并生成預(yù)渲染內(nèi)容(即“SSR”(服務(wù)器端渲染))。
自動提交表單,進(jìn)行 UI 測試,鍵盤輸入等。
創(chuàng)建一個(gè)時(shí)時(shí)更新的自動化測試環(huán)境。 使用最新的 JavaScript 和瀏覽器功能直接在最新版本的Chrome中執(zhí)行測試。
捕獲網(wǎng)站的 timeline trace,用來幫助分析性能問題。
測試瀏覽器擴(kuò)展。

 

安裝

安裝有瀏覽器的版本

npm i puppeteer

這個(gè)版本自帶Chromium瀏覽器,體積在300多M

2024.1更新

現(xiàn)在默認(rèn)不會安裝Chromium,如果要安裝,運(yùn)行上述代碼以后,再運(yùn)行"node node_modules\puppeteer\install.js",如果提示沒有install.js,則運(yùn)行"node_modules\puppeteer\install.mjs"

如果電腦有谷歌瀏覽器,可以使用下面代碼

npm i puppeteer-core

 

簡單使用

截圖

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    //設(shè)置可視區(qū)域大小
    await page.setViewport({width: 1920, height: 800});
    await page.goto('https://youdata.163.com');
    //對整個(gè)頁面截圖
    await page.screenshot({
        path: './files/capture.png',  //圖片保存路徑
        type: 'png',
        fullPage: true //邊滾動邊截圖
        // clip: {x: 0, y: 0, width: 1920, height: 800}
    });
    //對頁面某個(gè)元素截圖
    let [element] = await page.$x('/html/body/section[4]/div/div[2]');
    await element.screenshot({
        path: './files/element.png'
    });
    await page.close();
    await browser.close();
})();

 

 

 

模擬用戶登錄

(async () => {
    const browser = await puppeteer.launch({
        slowMo: 100,    //放慢速度
        headless: false,
        defaultViewport: {width: 1440, height: 780},
        ignoreHTTPSErrors: false, //忽略 https 報(bào)錯(cuò)
        args: ['--start-fullscreen'] //全屏打開頁面
    });
    const page = await browser.newPage();
    await page.goto('https://demo.youdata.com');
    //輸入賬號密碼
    const uniqueIdElement = await page.$('#uniqueId');
    await uniqueIdElement.type('admin@admin.com', {delay: 20});
    const passwordElement = await page.$('#password', {delay: 20});
    await passwordElement.type('123456');
    //點(diǎn)擊確定按鈕進(jìn)行登錄
    let okButtonElement = await page.$('#btn-ok');
    //等待頁面跳轉(zhuǎn)完成,一般點(diǎn)擊某個(gè)按鈕需要跳轉(zhuǎn)時(shí),都需要等待 page.waitForNavigation() 執(zhí)行完畢才表示跳轉(zhuǎn)成功
    await Promise.all([
        okButtonElement.click(),
        page.waitForNavigation()  
    ]);
    console.log('admin 登錄成功');
    await page.close();
    await browser.close();
})();

那么 ElementHandle 都提供了哪些操作元素的函數(shù)呢?

elementHandle.click():點(diǎn)擊某個(gè)元素
elementHandle.tap():模擬手指觸摸點(diǎn)擊
elementHandle.focus():聚焦到某個(gè)元素
elementHandle.hover():鼠標(biāo) hover 到某個(gè)元素上
elementHandle.type('hello'):在輸入框輸入文本

 

請求攔截

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    const blockTypes = new Set(['image', 'media', 'font']);
    await page.setRequestInterception(true); //開啟請求攔截
    page.on('request', request => {
        const type = request.resourceType();
        const shouldBlock = blockTypes.has(type);
        if(shouldBlock){
            //直接阻止請求
            return request.abort();
        }else{
            //對請求重寫
            return request.continue({
                //可以對 url,method,postData,headers 進(jìn)行覆蓋
                headers: Object.assign({}, request.headers(), {
                    'puppeteer-test': 'true'
                })
            });
        }
    });
    await page.goto('https://demo.youdata.com');
    await page.close();
    await browser.close();
})();

那 page 頁面上都提供了哪些事件呢?

page.on('close') 頁面關(guān)閉
page.on('console') console API 被調(diào)用
page.on('error') 頁面出錯(cuò)
page.on('load') 頁面加載完
page.on('request') 收到請求
page.on('requestfailed') 請求失敗
page.on('requestfinished') 請求成功
page.on('response') 收到響應(yīng)
page.on('workercreated') 創(chuàng)建 webWorker
page.on('workerdestroyed') 銷毀 webWorker

 

獲取 WebSocket 響應(yīng)

Puppeteer 目前沒有提供原生的用于處理 WebSocket 的 API 接口,但是我們可以通過更底層的 Chrome DevTool Protocol (CDP) 協(xié)議獲得

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    //創(chuàng)建 CDP 會話
    let cdpSession = await page.target().createCDPSession();
    //開啟網(wǎng)絡(luò)調(diào)試,監(jiān)聽 Chrome DevTools Protocol 中 Network 相關(guān)事件
    await cdpSession.send('Network.enable');
    //監(jiān)聽 webSocketFrameReceived 事件,獲取對應(yīng)的數(shù)據(jù)
    cdpSession.on('Network.webSocketFrameReceived', frame => {
        let payloadData = frame.response.payloadData;
        if(payloadData.includes('push:query')){
            //解析payloadData,拿到服務(wù)端推送的數(shù)據(jù)
            let res = JSON.parse(payloadData.match(/\{.*\}/)[0]);
            if(res.code !== 200){
                console.log(`調(diào)用websocket接口出錯(cuò):code=${res.code},message=${res.message}`);
            }else{
                console.log('獲取到websocket接口數(shù)據(jù):', res.result);
            }
        }
    });
    await page.goto('https://netease.youdata.163.com/dash/142161/reportExport?pid=700209493');
    await page.waitForFunction('window.renderdone', {polling: 20});
    await page.close();
    await browser.close();
})();

 

植入 javascript 代碼

Puppeteer 最強(qiáng)大的功能是,你可以在瀏覽器里執(zhí)行任何你想要運(yùn)行的 javascript 代碼,下面是我在爬 188 郵箱的收件箱用戶列表時(shí),發(fā)現(xiàn)每次打開收件箱再關(guān)掉都會多處一個(gè) iframe 來,隨著打開收件箱的增多,iframe 增多到瀏覽器卡到無法運(yùn)行,所以我在爬蟲代碼里加了刪除無用 iframe 的腳本:

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://webmail.vip.188.com');
    //注冊一個(gè) Node.js 函數(shù),在瀏覽器里運(yùn)行
    await page.exposeFunction('md5', text =>
        crypto.createHash('md5').update(text).digest('hex')
    );
    //通過 page.evaluate 在瀏覽器里執(zhí)行刪除無用的 iframe 代碼
    await page.evaluate(async () =>  {
        let iframes = document.getElementsByTagName('iframe');
        for(let i = 3; i <  iframes.length - 1; i++){
            let iframe = iframes[i];
            if(iframe.name.includes("frameBody")){
                iframe.src = 'about:blank';
                try{
                    iframe.contentWindow.document.write('');
                    iframe.contentWindow.document.clear();
                }catch(e){}
                //把iframe從頁面移除
                iframe.parentNode.removeChild(iframe);
            }
        }
        //在頁面中調(diào)用 Node.js 環(huán)境中的函數(shù)
        const myHash = await window.md5('PUPPETEER');
        console.log(`md5 of ${myString} is ${myHash}`);
    });
    await page.close();
    await browser.close();
})();

page.evaluate(pageFunction[, ...args]):在瀏覽器環(huán)境中執(zhí)行函數(shù)
page.evaluateHandle(pageFunction[, ...args]):在瀏覽器環(huán)境中執(zhí)行函數(shù),返回 JsHandle 對象
page.$$eval(selector, pageFunction[, ...args]):把 selector 對應(yīng)的所有元素傳入到函數(shù)并在瀏覽器環(huán)境執(zhí)行
page.$eval(selector, pageFunction[, ...args]):把 selector 對應(yīng)的第一個(gè)元素傳入到函數(shù)在瀏覽器環(huán)境執(zhí)行
page.evaluateOnNewDocument(pageFunction[, ...args]):創(chuàng)建一個(gè)新的 Document 時(shí)在瀏覽器環(huán)境中執(zhí)行,會在頁面所有腳本執(zhí)行之前執(zhí)行
page.exposeFunction(name, puppeteerFunction):在 window 對象上注冊一個(gè)函數(shù),這個(gè)函數(shù)在 Node 環(huán)境中執(zhí)行,有機(jī)會在瀏覽器環(huán)境中調(diào)用 Node.js 相關(guān)函數(shù)庫

 

抓取 iframe 中的元素

一個(gè) Frame 包含了一個(gè)執(zhí)行上下文(Execution Context),我們不能跨 Frame 執(zhí)行函數(shù),一個(gè)頁面中可以有多個(gè) Frame,主要是通過 iframe 標(biāo)簽嵌入的生成的。其中在頁面上的大部分函數(shù)其實(shí)是 page.mainFrame().xx 的一個(gè)簡寫,F(xiàn)rame 是樹狀結(jié)構(gòu),我們可以通過 frame.childFrames() 遍歷到所有的 Frame,如果想在其它 Frame 中執(zhí)行函數(shù)必須獲取到對應(yīng)的 Frame 才能進(jìn)行相應(yīng)的處理

以下是在登錄 188 郵箱時(shí),其登錄窗口其實(shí)是嵌入的一個(gè) iframe,以下代碼時(shí)我們在獲取 iframe 并進(jìn)行登錄

(async () => {
    const browser = await puppeteer.launch({headless: false, slowMo: 50});
    const page = await browser.newPage();
    await page.goto('https://www.188.com');
    //點(diǎn)擊使用密碼登錄
    let passwordLogin = await page.waitForXPath('//*[@id="qcode"]/div/div[2]/a');
    await passwordLogin.click();
    for (const frame of page.mainFrame().childFrames()){
        //根據(jù) url 找到登錄頁面對應(yīng)的 iframe
        if (frame.url().includes('passport.188.com')){
            await frame.type('.dlemail', 'admin@admin.com');
            await frame.type('.dlpwd', '123456');
            await Promise.all([
                frame.click('#dologin'),
                page.waitForNavigation()
            ]);
            break;
        }
    }
    await page.close();
    await browser.close();
})();

文件的上傳和下載

在自動化測試中,經(jīng)常會遇到對于文件的上傳和下載的需求,那么在 Puppeteer 中如何實(shí)現(xiàn)呢?

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    //通過 CDP 會話設(shè)置下載路徑
    const cdp = await page.target().createCDPSession();
    await cdp.send('Page.setDownloadBehavior', {
        behavior: 'allow', //允許所有下載請求
        downloadPath: 'path/to/download'  //設(shè)置下載路徑
    });
    //點(diǎn)擊按鈕觸發(fā)下載
    await (await page.waitForSelector('#someButton')).click();
    //等待文件出現(xiàn),輪訓(xùn)判斷文件是否出現(xiàn)
    await waitForFile('path/to/download/filename');

    //上傳時(shí)對應(yīng)的 inputElement 必須是<input>元素
    let inputElement = await page.waitForXPath('//input[@type="file"]');
    await inputElement.uploadFile('/path/to/file');
    browser.close();
})();

 

 

模擬選擇文件

點(diǎn)擊元素觸發(fā)選擇文件框,不會顯示,直接返回選擇文件

    const [fileChooser] = await Promise.all([
        page.waitForFileChooser(),
        page.click('#mydropzone'), // some button that triggers file selection
    ]);
    await fileChooser.accept(['D:\\down\\tmp.zip']);

 

 

跳轉(zhuǎn)新 tab 頁處理

在點(diǎn)擊一個(gè)按鈕跳轉(zhuǎn)到新的 Tab 頁時(shí)會新開一個(gè)頁面,這個(gè)時(shí)候我們?nèi)绾潍@取改頁面對應(yīng)的 Page 實(shí)例呢?可以通過監(jiān)聽 Browser 上的 targetcreated 事件來實(shí)現(xiàn),表示有新的頁面創(chuàng)建:

let page = await browser.newPage();
await page.goto(url);
let btn = await page.waitForSelector('#btn');
//在點(diǎn)擊按鈕之前,事先定義一個(gè) Promise,用于返回新 tab 的 Page 對象
const newPagePromise = new Promise(res => 
  browser.once('targetcreated', 
    target => res(target.page())
  )
);
await btn.click();
//點(diǎn)擊按鈕后,等待新tab對象
let newPage = await newPagePromise;

 

 

模擬不同的設(shè)備

Puppeteer 提供了模擬不同設(shè)備的功能,其中 puppeteer.devices 對象上定義很多設(shè)備的配置信息,這些配置信息主要包含 viewport 和 userAgent,然后通過函數(shù) page.emulate 實(shí)現(xiàn)不同設(shè)備的模擬

const puppeteer = require('puppeteer');
const iPhone = puppeteer.devices['iPhone 6'];
puppeteer.launch().then(async browser => {
  const page = await browser.newPage();
  await page.emulate(iPhone);
  await page.goto('https://www.google.com');
  await browser.close();
});

 

其他信息

官方中文文檔

https://zhaoqize.github.io/puppeteer-api-zh_CN/#/

 

THE END
av素人天堂_free性亚洲_久久亚洲国产视频_国产网红在线_午夜av在线播放_欧美成人精品福利网站_热99在线观看_国产在线观看免费麻豆_日本高清在线观看_亚洲免费网站观看视频
国产最顶级的黄色片在线免费观看| 日韩三级视频在线播放| 欧美国产小视频| 日韩不卡高清视频| 最近中文字幕在线中文高清版| 中文天堂资源在线| 91蜜桃婷婷狠狠久久综合9色| 欧美日韩综合视频| 欧美婷婷精品激情| 一级片免费在线播放| 日韩欧美在线1卡| 欧美不卡一区二区| 99久久精品国产亚洲| 青青国产91久久久久久| 欧美亚洲天堂网| 国产日韩av高清| 亚洲免费婷婷| 日韩精品视频免费在线观看| 中文字幕欧美日韩| 国产字幕中文| 亚洲黄色一区二区| 一区二区三区在线播放视频| 欧美精品一区二区三区在线播放| 在线视频国内一区二区| 中文字幕亚洲一区二区av在线| 一区在线免费| av丝袜在线| 精品网站999www| 一级片在线播放| 91亚洲欧美| 91色在线看| 日韩欧美一级在线播放| 一区二区三区视频网站| 一区二区视频在线| 国产又粗又猛又爽又黄91精品| 亚洲视频在线观看日本a| 中文字幕亚洲字幕| 中文字幕无线码一区| 国产在线日韩欧美| 日韩欧美亚洲国产| 二区三区中文字幕| 日韩在线视频精品| 国产999精品在线观看| 国产1区在线| 日韩亚洲一区在线| 正在播放日韩精品| 欧美日韩国产高清| 在线日韩欧美| 欧美三级精品| 日韩三级高清在线| 亚洲乱码一区av黑人高潮| 亚洲最新免费视频| 日本亚洲视频在线| 在线国产99| 午夜成人鲁丝片午夜精品| 日韩精品一区二区三区视频播放| 国产视频一区三区| 日韩国产亚洲欧美| 欧美一级二级三级区| 欧美特黄一区| 91精品国产乱码久久蜜臀| 91精品婷婷国产综合久久竹菊| 亚洲女同中文字幕| 欧洲精品二区| 欧美在线亚洲一区| 日韩av综合在线观看| 九九在线精品| 亚洲校园欧美国产另类| 亚洲电影中文字幕在线观看| 国产欧美日韩精品在线观看| 综合图区亚洲白拍在线| 亚洲国内精品视频| 尤物在线精品| 国产网站av| 在线中文免费视频| 国产v日产∨综合v精品视频| 在线看av的网址| 91精品免费观看| 亚洲一区精品在线| 日韩欧美不卡在线| 欧美日韩国产不卡| 91精品国产综合久久精品app| 中文字幕一区免费| 婷婷中文字幕一区| 中文字幕在线中文字幕二区| 亚洲欧洲综合另类| 婷婷中文字幕综合| 亚洲二区自拍| 一区视频在线播放| 国产三级在线| 国产h片在线观看| 亚洲欧美久久久| 国产欧美日韩不卡免费| 国产乱国产乱老熟300| 日韩精品视频在线| 亚洲素人一区二区| 91久久久精品| 日韩av二区| 国产123在线| 国产午夜精品视频| 国产日韩专区| 欧美在线视频第一页| 欧美不卡视频一区| 婷婷中文字幕一区三区| 久久久精品国产99久久精品芒果| 91精品国产综合久久香蕉最新版| 亚洲第一中文字幕在线观看| 免费高清视频日韩| 亚洲欧美中文字幕在线一区| 免费高清特黄a大片| 日韩视频精品在线观看| 中文字幕 亚洲视频| 伊人精品视频| 国产三级在线播放| 欧美日韩国产影片| 最近中文字幕在线中文高清版| 色综合天天性综合| 国产日韩成人精品| 国产91大片| 亚洲丝袜一区| 欧美日韩视频免费播放| 欧美日韩综合高清一区二区| 黄色精品在线观看| 欧美日韩国产系列| 亚洲综合欧美在线| 色www精品视频在线观看| 国产午夜精品全部视频播放| av一区在线| 一级片在线免费看| 91精品蜜臀在线一区尤物| 久久久另类综合| 国产高清一区| 91精品免费观看| 国产成人一区二区精品非洲| 午夜一区二区三区视频| 日韩一级网站| 在线一区二区不卡| 亚洲社区在线| 99在线国产| 日本黄色一区二区| 日韩欧美三级视频| 一级免费a一片| 国产三级在线| 国产欧美中文在线| 中文字幕在线高清| 国产欧美日韩视频| 视频在线一区二区| 欧美日韩国产成人| 日韩视频一区在线观看| 一区二区三区在线播放欧美| 影音先锋中文字幕在线观看| 91精品国产综合久久久久久| 精品欧美日韩在线| 日韩一二三四区| 91精品国产综合久久久久久| 中文字幕在线视频久| а√天堂中文在线资源8| 久久69成人| 亚洲福利一区| 欧美日韩免费不卡视频一区二区三区| 日韩wumaV| 一区二区三区在线免费| 日韩欧美中文字幕在线观看| 不卡福利视频| 欧美日韩国产黄色| 91精品国产高清91久久久久久| 久久蜜桃一区二区| 国产专区中文字幕| 国产亚洲一区字幕| 日韩亚洲欧美中文字幕| 亚洲第一视频在线观看| 日韩精品视频在线观看视频| 日韩欧美国产一二三区| 久久久99久久| 精品视频三区| 中文字幕精品视频在线| 免费高清视频日韩| 欧美日韩国产综合视频在线观看中文| 日韩精品视频在线播放| 日韩在线观看视频一区二区| 亚洲乱码中文字幕| 久久久水蜜桃| 视频一区二区不卡| 欧美色视频一区二区三区在线观看| 婷婷中文字幕在线观看| 日韩欧美一级在线播放| 亚洲国产欧美日韩精品| 中文字幕欧美在线| 亚洲大片精品永久免费| 中文字幕第一页在线播放| 在线视频不卡国产V| 日韩国产欧美三级| 欧美乱大交xxxxx免费| 91精品综合久久久久久| 91久久大香伊蕉在人线| 亚洲第一页中文字幕| 亚洲一区日韩精品中文字幕| 日本不卡高清视频一区| 欧美日中文字幕| 91精品国产全国免费观看| 欧美三级日韩三级国产三级| 日韩一级免费在线观看| 伊人伊成久久人综合网小说| 日韩美女视频一区二区在线观看| 国产黄色一区| 欧美日韩国产中文精品字幕自在自线| 欧美日韩午夜精品| 免费网站看黄yyy222| 香蕉av一区| 中文字幕亚洲乱码| 亚洲视频 中文字幕| 亚洲最大黄色| 日韩欧美国产成人精品免费| 中文字幕4区| 欧美日韩一区二区在线视频| 国产日韩亚洲欧美| 日韩国产欧美三级| 中文在线а√在线8| 国产视频不卡| 中文字幕在线中文字幕二区| 欧美日韩国产一级片| 中文在线视频| 午夜国产福利在线观看| 午夜高潮免费视频| www日韩在线观看| 免费高清在线一区| 亚洲成av人片在线| 中文字幕视频在线免费欧美日韩综合在线看| 二区中文字幕| 精品人妻二区中文字幕| 亚洲区中文字幕| 亚洲成在线观看| 久久精品最新免费国产成人| 天天综合日日夜夜精品| 不卡一二三区| 国产在线拍揄自揄拍| 日本一欧美一欧美一亚洲视频| 日本亚洲欧美| 欧美成人精品在线| 欧美大片在线观看一区| 国产激情在线播放| 最近中文字幕第一页| 最近免费中文字幕在线第一页| 香蕉av一区| 欧美日韩第一| www.久久久精品| 国产裸舞福利在线视频合集| 欧美日韩亚洲国内综合网| 精品视频—区二区三区免费| 国产久卡久卡久卡久卡视频精品| 深夜福利一区| 亚洲国内精品视频| 欧美日韩在线不卡一区| 日韩中文字幕视频网| 中文字幕亚洲第一| 免费精品国产自产拍在| 一本一道久久a久久精品综合蜜臀| 国产亚洲人成a一在线v站| 日韩在线三区| 国产在线视频不卡| 亚洲一级特黄| 欧美日韩国产系列| 91久久精品在线| 中文字幕亚洲一区在线观看| 欧美国产综合视频| 一级日本免费的| 一区二区在线高清视频| av免费网站在线| 中文国产字幕在线观看| 亚洲一区在线观看免费| 精品日韩在线| 欧美日韩精品电影| 国产视频一区二| 亚洲女同中文字幕| 日韩视频国产视频| 91日韩欧美| 红桃视频亚洲| 欧美啪啪一区| 日韩欧美一级精品久久| 欧美日韩国产高清| 亚洲va韩国va欧美va精品| 日本一欧美一欧美一亚洲视频| 国产小视频免费在线观看| 亚洲电影中文字幕在线观看| 国产 日韩 欧美 综合 一区| 91精品国产综合久久蜜臀| 欧美日韩综合视频网址| 亚洲永久免费视频| 中文字幕一区二区三区精品| 久久永久免费视频| 日韩国产成人精品| 欧美色视频一区二区三区在线观看| 日韩久久99| 精品久久在线观看| 精品亚洲国内自在自线福利| 亚洲va中文字幕| 亚洲永久字幕| 日韩av一区二区在线观看| 国产在线欧美日韩| 国产乱一区二区| 中文字幕成人乱码在线电影| 91久久精品国产| 91久久在线| 91精品在线观看视频| 中文精品在线观看| 中文字幕亚洲一区在线观看| 日韩欧美99| 日韩视频中文字幕| 91精品高清| 中文字幕日韩第一页| 国产极品嫩模在线视频一区| 国产卡1卡2卡三卡在线| 日韩视频精品在线| 中文字幕 欧美 日韩| 欧美日韩国产在线观看| 欧美一级手机免费观看片| 欧美国产91| 国产高清精品二区| 久久电影国产免费久久电影| 国产三级在线观看视频| 国产一区 二区 三区一级| 国产在线播放一区二区| 免费在线视频一区二区| 欧美日韩在线播放一区| 日韩精品在线网站| 三级网站免费观看| 日韩欧美999| 999在线视频| www.中文字幕在线观看| 欧美日韩久久不卡| 99精品一级欧美片免费播放| 日韩欧美国产高清| 日韩一级二级三级| 精品一区二区三区中文字幕| 亚洲中文字幕在线一区| 欧美日韩综合在线| 高清日韩中文字幕| 日韩三级精品电影久久久| 日韩欧美一级视频| 人成在线免费视频| 免费精品国产自产拍在| 日韩精品视频在线观看视频| 欧美一级免费在线观看| 国产啊啊啊视频在线观看| 欧美国产一级片| 国产一卡2卡3卡免费网站| 精品久久久三级| 欧美在线视频一区二区| 欧美国产综合在线V| 国产午夜在线观看| 国产欧美综合在线| a天堂在线资源| 欧美日韩人人澡狠狠躁视频| 日韩不卡在线观看| 欧美日韩免费高清| 91精品国产自产91精品| 91精品电影| 欧美日韩高清在线| 国产婷婷色一区二区三区在线| 午夜国产福利在线观看| 精品国产99久久久久久| 亚洲福利精品视频| 最新中文字幕在线| 欧美日韩高清一区二区不卡| 久草中文在线观看| av免费观看国产| 国产无遮挡在线视频免费观看| 搞黄在线观看| 成人一区二区不卡免费| 欧美国产一级片| 国产激情久久| 国产在线小视频| 欧美日韩在线精品成人综合网| 午夜一区二区三区视频| 一区二区视频免费看| 色综合天天综合网国产成人综合天| 欧美国产一级| 91精品国产91久久久久久不卡| 91精品国产日韩91久久久久久| 日韩精品手机在线| 中文字幕在线视频网| 国产对白在线| 中文字幕日韩在线观看| 日韩视频中文| 日韩欧美国产午夜精品| 免费视频久久| 国产日韩中文字幕| 欧美 日韩 国产 高清| 91精品免费观看| 国产在线精品日韩| 国产在线黄色| 天堂在线中文| 亚洲经典中文字幕| 中文字幕五月欧美| 国产欧美日韩三级| 亚洲精品中文字幕乱码三区| 被陌生人带去卫生间啪到腿软| 亚洲国产欧美日韩在线| www.久久草| 国产综合精品在线|