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

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

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

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

 

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

 

安裝

安裝有瀏覽器的版本

npm i puppeteer

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

2024.1更新

現(xiàn)在默認不會安裝Chromium,如果要安裝,運行上述代碼以后,再運行"node node_modules\puppeteer\install.js",如果提示沒有install.js,則運行"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');
    //對整個頁面截圖
    await page.screenshot({
        path: './files/capture.png',  //圖片保存路徑
        type: 'png',
        fullPage: true //邊滾動邊截圖
        // clip: {x: 0, y: 0, width: 1920, height: 800}
    });
    //對頁面某個元素截圖
    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 報錯
        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');
    //點擊確定按鈕進行登錄
    let okButtonElement = await page.$('#btn-ok');
    //等待頁面跳轉(zhuǎn)完成,一般點擊某個按鈕需要跳轉(zhuǎn)時,都需要等待 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():點擊某個元素
elementHandle.tap():模擬手指觸摸點擊
elementHandle.focus():聚焦到某個元素
elementHandle.hover():鼠標 hover 到某個元素上
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 進行覆蓋
                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') 頁面出錯
page.on('load') 頁面加載完
page.on('request') 收到請求
page.on('requestfailed') 請求失敗
page.on('requestfinished') 請求成功
page.on('response') 收到響應
page.on('workercreated') 創(chuàng)建 webWorker
page.on('workerdestroyed') 銷毀 webWorker

 

獲取 WebSocket 響應

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 事件,獲取對應的數(shù)據(jù)
    cdpSession.on('Network.webSocketFrameReceived', frame => {
        let payloadData = frame.response.payloadData;
        if(payloadData.includes('push:query')){
            //解析payloadData,拿到服務端推送的數(shù)據(jù)
            let res = JSON.parse(payloadData.match(/\{.*\}/)[0]);
            if(res.code !== 200){
                console.log(`調(diào)用websocket接口出錯: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 最強大的功能是,你可以在瀏覽器里執(zhí)行任何你想要運行的 javascript 代碼,下面是我在爬 188 郵箱的收件箱用戶列表時,發(fā)現(xiàn)每次打開收件箱再關(guān)掉都會多處一個 iframe 來,隨著打開收件箱的增多,iframe 增多到瀏覽器卡到無法運行,所以我在爬蟲代碼里加了刪除無用 iframe 的腳本:

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://webmail.vip.188.com');
    //注冊一個 Node.js 函數(shù),在瀏覽器里運行
    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 對應的所有元素傳入到函數(shù)并在瀏覽器環(huán)境執(zhí)行
page.$eval(selector, pageFunction[, ...args]):把 selector 對應的第一個元素傳入到函數(shù)在瀏覽器環(huán)境執(zhí)行
page.evaluateOnNewDocument(pageFunction[, ...args]):創(chuàng)建一個新的 Document 時在瀏覽器環(huán)境中執(zhí)行,會在頁面所有腳本執(zhí)行之前執(zhí)行
page.exposeFunction(name, puppeteerFunction):在 window 對象上注冊一個函數(shù),這個函數(shù)在 Node 環(huán)境中執(zhí)行,有機會在瀏覽器環(huán)境中調(diào)用 Node.js 相關(guān)函數(shù)庫

 

抓取 iframe 中的元素

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

以下是在登錄 188 郵箱時,其登錄窗口其實是嵌入的一個 iframe,以下代碼時我們在獲取 iframe 并進行登錄

(async () => {
    const browser = await puppeteer.launch({headless: false, slowMo: 50});
    const page = await browser.newPage();
    await page.goto('https://www.188.com');
    //點擊使用密碼登錄
    let passwordLogin = await page.waitForXPath('//*[@id="qcode"]/div/div[2]/a');
    await passwordLogin.click();
    for (const frame of page.mainFrame().childFrames()){
        //根據(jù) url 找到登錄頁面對應的 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 中如何實現(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è)置下載路徑
    });
    //點擊按鈕觸發(fā)下載
    await (await page.waitForSelector('#someButton')).click();
    //等待文件出現(xiàn),輪訓判斷文件是否出現(xiàn)
    await waitForFile('path/to/download/filename');

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

 

 

模擬選擇文件

點擊元素觸發(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 頁處理

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

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

 

 

模擬不同的設(shè)備

Puppeteer 提供了模擬不同設(shè)備的功能,其中 puppeteer.devices 對象上定義很多設(shè)備的配置信息,這些配置信息主要包含 viewport 和 userAgent,然后通過函數(shù) page.emulate 實現(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/#/

 

上一篇 MySQL多種索引引擎詳解
下一篇 CoreDownload - WP下載增強插件 1.0.6
目錄
applek

applek管理員

個人說明在個人中心里面設(shè)置

本月創(chuàng)作熱力圖

最新評論
chinacnd
chinacnd
6月26日
這個主題是怎么做到加載速度那么快的?
風起云涌
風起云涌
6月17日
前臺投稿現(xiàn)在有點太抽象了 希望可以弄成那種分區(qū)填寫的 標題,內(nèi)容,圖片,目錄,標簽,這樣的
評論于留言建議
風起云涌
風起云涌
6月17日
希望加個開關(guān)去掉頁腳的站點身份,還有自定義頁腳居中文字
評論于留言建議
卡卡
卡卡
5月31日
倒是放個演示地址啊
av素人天堂_free性亚洲_久久亚洲国产视频_国产网红在线_午夜av在线播放_欧美成人精品福利网站_热99在线观看_国产在线观看免费麻豆_日本高清在线观看_亚洲免费网站观看视频
国产久卡久卡久卡久卡视频精品| 欧美日韩91| 一区二区高清在线| www日韩在线观看| 精品久久久91| 日韩欧美中文在线视频| 精品日韩视频在线观看| 中文字幕第一页在线播放| 国产www在线观看| 青青久在线视频免费观看| 欧美日韩日本视频| 91精品在线观看国产| 一区二区三区在线播放欧美| 国产乱国产乱老熟300| 日韩精品一二三四区| 中文字幕第一页在线| 国产黄色在线观看| 被陌生人带去卫生间啪到腿软| 国产在线拍揄自揄拍| 日韩欧美在线综合| 97视频在线| 欧美一级一级性生活免费录像| 在线视频亚洲| 国产视频中文字幕在线观看| 亚洲va韩国va欧美va精品| 日韩中文字幕网| 国产亚洲视频中文字幕视频| 国产成人中文字幕| 国产欧美日韩在线播放| 国产日韩电影| 欧美国产小视频| 国产丝袜欧美中文另类| 中文 欧美 日韩| 欧美日韩国产中文精品字幕自在自线| 日韩免费视频一区二区| 亚洲一区在线观看网站| 欧美一级日韩不卡播放免费| 亚洲女人天堂色在线7777| 中文字幕精品视频在线| 亚洲欧洲精品在线| 欧美日韩国产在线播放| 91精品国产色综合久久久蜜香臀| 国产美女主播视频一区| 日韩欧美中文字幕视频| 国产日产一区二区| 国产对白在线| 亚洲综合在线小说| 日韩欧美一级精品久久| 日本精品国语自产拍在线观看| 99精品在线播放| 黄色视屏免费在线观看| 91精品久久久久久久久| 国产成人综合精品| 精品福利二区三区| 欧美日韩三级一区| 日韩欧美中文视频| 91精品久久久久久久91蜜桃| 国产欧美日韩在线看| 欧美日韩国产亚洲一区| 99国产成 人 综合 亚洲欧美| 日韩欧美国产亚洲| av高清一区| 91精品国产自产在线观看永久∴| 91欧美日韩麻豆精品| 欧美日韩性视频| 日韩中文字幕观看| 91精品国产全国免费观看| 中文字幕在线看视频国产欧美| 日韩av一区二区在线观看| 日韩视频免费直播| 久久精品人妻一区二区三区| 欧美午夜影院在线视频| 国产v日产∨综合v精品视频| 精品久久香蕉国产线看观看gif| 国产成人精品综合久久久| 欧美在线视频一区二区| 亚洲日本欧美日韩高观看| 欧美日韩国产一二三| 综合激情国产一区| 一级片免费网站| 日韩欧美三级| 亚州黄色一级| 极品久久久久久| 欧美日韩在线视频一区| 国产欧美日韩在线播放| 天堂在线中文资源| 日韩欧美在线视频日韩欧美在线视频| 久久久久久自在自线| 色综合天天综合网国产成人综合天| 国产欧美日韩在线播放| 国产日韩av一区| 日韩精品在线视频| 亚洲综合三区| 亚洲第一视频网站| 精品九九久久| 日韩欧美一级在线| 日韩亚洲欧美中文三级| 国产欧美综合在线观看第十页| 精品国产乱码久久久久久牛牛| 欧美一级久久久久久久久大| 日本不卡视频一区| 中文字幕在线精品| 91精品久久久久久久久| 欧美日韩一区二区在线视频| 视频一区中文字幕国产| 天堂在线中文资源| 欧美精品一区二区三区在线播放| www.中文字幕在线| 欧美日韩精品在线观看| 欧美日韩在线播放视频| 国产午夜精品久久| 亚洲欧洲在线观看av| 国产一区不卡精品| 欧美日韩精品免费| 国产日韩精品在线观看| 日本亚洲欧美| 日韩精品视频免费在线观看| 欧美日韩精品在线| 在线视频国内一区二区| 久久精品在线观看| 首页国产欧美久久| 精品久久九九| 在线中文字幕网站| 欧美va亚洲va日韩∨a综合色| 国产1卡2卡三卡四卡网站| 中文字幕久久精品| 亚洲成人7777| 久久久久久久久99精品| 久久99蜜桃精品久久久久小说| 天堂在线中文| 黄色视屏免费在线观看| 99pao成人国产永久免费视频| 欧美一级一级性生活免费录像| 日韩视频精品在线观看| 欧美日韩国产首页| 国产福利一区二区在线精品| 日本xxxwww免费视频| 一区二区不卡久久精品| 日韩你懂的电影在线观看| 91精品国产综合久久久久久| 欧美日韩激情在线一区二区三区| 亚洲日产av中文字幕| 91精品国产91久久久久久久久| 一区二区91| 精品三级av| 精品亚洲国内自在自线福利| 中文字幕在线视频久| 91精品国产91久久久久久青草| 欧美日韩精品欧美日韩精品| 日本一级一片免费视频| 日韩精品视频免费播放| 中文字幕在线视频久| 久久久久久99精品| 亚洲欧美中文字幕在线观看| 1区2区在线| 欧美日韩国产影片| 精品熟女一区二区三区| 亚洲综合日韩| 日韩中文字幕第一页| 国产羞羞视频在线播放| 久久精品夜夜夜夜久久| 国产网站欧美日韩免费精品在线观看| 日韩亚洲国产欧美| 亚洲黄在线观看| 一区视频在线播放| 日韩精品在线中文字幕| 精品亚洲国内自在自线福利| 精品av中文字幕在线毛片| 91精品啪在线观看国产60岁| 国产99亚洲| 91精品国产91综合久久蜜臀| 亚洲热在线观看| 欧美高清一区| 亚洲欧洲在线观看av| 日韩欧美国产免费| 欧美一级日韩不卡播放免费| 亚洲福利在线看| 国产福利在线导航| 色屁屁一区二区| 久久网站免费观看| 亚洲狠狠婷婷综合久久久久图片| 99精品一级欧美片免费播放| 久久中文精品| 在线观看免费国产成人软件| 成片免费观看| 久久久久久欧美| 亚洲一区精品在线| 国产小视频在线观看免费| 一区二区三区在线播放欧美| 久久精品最新免费国产成人| 亚洲欧美中文在线视频| 欧美日韩在线观看首页| 午夜亚洲福利| 免费看黄资源大全高清| 欧美日韩中文字幕日韩欧美| 欧美在线观看视频一区| 亚洲一卡二卡在线观看| 91精品免费在线观看| 一级免费a一片| 亚洲第一香蕉网| 日韩三级一区| 中文字幕在线导航| 欧美日韩亚洲国产综合| 日韩视频不卡中文| 中文国产字幕在线观看| 在线观看av的网站| 一区二区日韩免费看| 日韩中文字幕在线视频观看| 中文字幕线观看| 在线观看国产福利视频| 欧美 日韩 国产 在线| 亚洲第一香蕉网| 国产日韩在线视频| 91精品国产91久久久| 国产福利不卡| 国产乱国产乱老熟300| 国产成人综合精品| 亚洲成年人影院在线| 欧美日韩中文在线| 欧美中文字幕在线观看视频| 天天在线视频色| 国产激情三区| 国产www.大片在线| 精品日韩在线观看| 国产婷婷一区二区| 欧美三级免费观看| 亚洲第一视频| 亚洲乱码在线观看| 国产日韩中文字幕在线| 欧美日韩精品是欧美日韩精品| 欧美日韩亚洲第一| 亚洲中午字幕| 国产v日产∨综合v精品视频| 亚洲大胆人体av| 亚洲专区一二三| 亚洲高清在线观看一区| 欧美日韩精品三区| 日韩欧美国产免费播放| wwwav91com| 偷窥国产亚洲免费视频| 精品欧美日韩精品| av中文天堂在线| 日韩在线观看a| 日韩av二区| 99精品一级欧美片免费播放| 日韩不卡在线播放| 久久精品国产91精品亚洲| 国产视频2区| 99色在线视频| 精品国产欧美日韩不卡在线观看| 国产一级免费看| 欧美日中文字幕| 中文官网资源新版中文第二页在线观看| 欧美日韩亚洲一区| 二区三区不卡不卡视频| 91精品婷婷国产综合久久| 国产欧美日韩高清| 欧美 中文字幕| 麻豆精品99| 亚洲欧洲日韩在线| 色猫猫国产区一区二在线视频| 欧美特黄一区| 国产日韩中文字幕| 一级片免费在线播放| 亚洲福利一区| 欧美日韩国产区| 欧美日韩中文字幕视频| 日韩欧美中文在线| 国产999在线观看| 日韩中文字幕在线观看视频| 亚洲欧洲精品在线| www.狠狠| 久久久综合精品| 国产成人日日夜夜| 欧美日韩国产第一页| 欧美亚洲另类制服自拍| 91精品在线免费观看| 91精品国产综合久久蜜臀| 国产一级粉嫩xxxx| 免费看ww视频网站入口| 91精品国产综合久久精品| 久久精品一级爱片| 91精品国产高清91久久久久久| 久久久久久久久综合| 精品成a人在线观看| 欧美日韩精品在线视频| 国产字幕在线看| 国产永久在线观看| 亚洲狠狠婷婷综合久久久久图片| 国产福利一区二区精品秒拍| 红桃视频亚洲| 日韩亚洲一区在线| 国产三级第一页| 日本精品免费观看高清观看| 日韩国产一区三区| 日韩你懂的电影在线观看| av中文资源在线| 亚洲高清免费一级二级三级| 91精品国产自产91精品| 91精品国产91久久久久久三级| 国产黄在线观看免费观看不卡| 日韩av在线中文字幕| 日韩欧美一二三区| 日韩在线三区| 97视频在线| 亚洲黄在线观看| 日韩欧美国产一二三区| 日韩精品视频在线免费观看| 综合激情一区| 国产欧美 在线欧美| 日韩免费精品视频| 亚洲第一视频在线观看| 日韩中文字幕二区| 日韩三级视频在线看| 精品日韩欧美在线| 欧美一级手机免费观看片| 在线中文字幕网站| 国产婷婷在线观看| 亚洲三级国产| 国产免费久久| 中文字幕久久av| 久久精品99久久久久久久久| 日韩在线视频网| 国产小视频在线观看| 精品国产999| 国产福利免费观看| 亚洲国产欧美日韩在线| 日韩视频精品| 色偷偷一区二区三区| 日韩中文字幕二区| 国产1卡2卡三卡四卡网站| 欧美,日韩,国产在线| 亚洲综合在线中文字幕| 国产三级免费观看| 亚洲免费观看在线观看| 日韩三级视频中文字幕| 欧美日韩99| 国产成人精品免费久久久久| 免费在线国产| 国产黄色在线免费观看| 欧美日韩精品是欧美日韩精品| 中文字幕欧美在线| 国产在线观看a| 国产日韩中文字幕| 午夜国产欧美理论在线播放| av免费不卡国产观看| 国产一区高清视频| 久久 天天综合| 日韩午夜黄色| 欧美日韩精品是欧美日韩精品| 日韩精品在线免费观看| 欧美三级日韩三级国产三级| 国产婷婷在线观看| 欧美成人vr18sexvr| 欧美日韩高清一区二区不卡| 顶级网黄在线播放| 亚洲国产欧美日韩在线| 欧美 日韩 国产在线观看| 在线视频不卡一区二区| 午夜伊人狠狠久久| 91午夜在线| 中文字幕欧美日韩va免费视频| 国产69精品久久app免费版| 国精品产品一区| 黄色资源在线观看| 欧美三级在线播放| 欧美日韩国产第一页| 高清国产一区| 中文在线不卡| 中文字幕亚洲一区二区av在线| 日韩亚洲欧美中文字幕| 91精品国产全国免费观看| 久久久精品国产99久久精品芒果| 日韩中文字幕久久| 91精品国产色综合久久久蜜香臀| 欧美91精品| 亚洲专区一二三| 久久电影国产免费久久电影| 精品三级久久| 精品国产网站在线观看| 国产日韩亚洲欧美| 国产超级va在线视频| 97久久精品| 日韩在线视频免费观看高清中文| 欧美一级欧美三级在线观看| 99视频在线看| a天堂中文在线官网在线| 91精品国产高清| 日韩欧美一级在线| 粉嫩粉嫩芽的虎白女18在线视频| 精品久久久91| 国产一级视频| 日韩免费不卡avV| 日韩在线视频免费观看高清中文| 视频一区二区国产| 99视频在线看| 91精品视频免费在线观看| 久久视频免费看| 精品三级在线| 韩日中文字幕第一页|