日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python selenium 用法 和 Chrome headless

發布時間:2024/7/23 python 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python selenium 用法 和 Chrome headless 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

From:?http://cuiqingcai.com/2599.html

Selenium教程:https://www.yiibai.com/selenium
selenium 官方參考文檔:https://selenium-python.readthedocs.io/index.html
Selenium Documentation:https://www.seleniumhq.org/docs
Selenium 與 PhantomJS:http://www.cnblogs.com/miqi1992/p/8093958.html
自動化測試工具 Selenium:http://www.51testing.com/zhuanti/selenium.html
Selenium :http://www.ltesting.net/ceshi/open/kygncsgj/selenium
Selenium 中文網:http://www.selenium.org.cn
Selenium發展史:https://www.cnblogs.com/fnng/p/7426928.html
Free Selenium Tutorials:https://www.guru99.com/selenium-tutorial.html
Selenium自動化測試教程:http://www.51zxw.net/list.aspx?cid=615
知乎 -?Selenium:https://www.zhihu.com/topic/19574589/top-answers
功能測試工具Selenium IDE:https://jingyan.baidu.com/article/ea24bc39bc48dada62b33139.html
Mechanize 和 Selenium:https://blog.csdn.net/u011974639/article/details/73148949
python爬蟲從入門到放棄(八)之 Selenium庫的使用:https://www.cnblogs.com/zhaof/p/6953241.html
python爬蟲 ---?基于selenium用火狐模擬登陸爬搜索關鍵詞的微博:https://blog.csdn.net/u010454729/article/details/51225388
selenium 模擬 fireFox瀏覽器,爬取網頁信息:https://github.com/wu-yy/myhomeCrawler

?

?

前言

? ? ? ? 前面學習了 PhantomJS 的基本用法,歸根結底它是一個沒有界面的瀏覽器,而且運行的是 JavaScript 腳本,然而這就能寫爬蟲了嗎?這又和Python有什么關系?接下來我們介紹的這個工具,統統解決掉你的疑惑。

?

?

簡介

? ? ? ? Selenium 是什么?一句話,自動化測試工具。簡單的說就是一個可以用代碼操所瀏覽器的工具。可以通過selenium進行搜索關鍵字,點擊按鈕等等操作。它支持各種瀏覽器,包括 Chrome,Safari,Firefox 等主流界面式瀏覽器,如果你在這些瀏覽器里面安裝一個 Selenium 的插件,那么便可以方便地實現Web界面的測試。換句話說叫 Selenium 支持這些瀏覽器驅動。當selenium升級到3.0之后,對不同的瀏覽器驅動進行了規范。如果想使用selenium驅動不同的瀏覽器,必須單獨下載并設置不同的瀏覽器驅動(注:部分瀏覽器驅動地址需要科學上網)。話說回來,PhantomJS 不也是一個瀏覽器嗎,那么 Selenium 支持不?答案是肯定的,這樣二者便可以實現無縫對接了。

? ? ? ? 然后又有什么好消息呢?Selenium支持多種語言開發,比如 Java,C,Ruby等等,有 Python 嗎?那是必須的!哦這可真是天大的好消息啊。

? ? ? ? 嗯,所以呢?安裝一下 Python 的 Selenium 庫,再安裝好 PhantomJS,不就可以實現 Python+Selenium+PhantomJS 的無縫對接了嘛!PhantomJS 用來渲染解析JS,Selenium 用來驅動以及與 Python 的對接,Python 進行后期的處理,完美的三劍客!

? ? ? ? 有人問,為什么不直接用瀏覽器而用一個沒界面的 PhantomJS 呢?答案是:效率高!

? ? ? ? Selenium 2,又名 WebDriver,主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾經是 Selenium 的競爭對手)。也就是說 Selenium 2 是 Selenium 和 WebDriver 兩個項目的合并,即 Selenium 2 兼容 Selenium,它既支持 Selenium API 也支持 WebDriver API。selenium 是一套完整的web應用程序測試系統,包含了測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)和測試的并行處理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript編寫,因此用于任何支持JavaScript的瀏覽器上。
selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。

?

更多詳情可以查看 Webdriver 的簡介。

Webdriver

嗯,通過以上描述,我們應該對 Selenium 有了大概對認識,接下來就讓我們開始進入動態爬取的新世界吧。

本文參考內容來自

Selenium官網?SeleniumPython文檔

??

用python寫爬蟲的時候,主要用的是selenium的Webdriver,我們可以通過下面的方式先看看Selenium.Webdriver支持哪些瀏覽器。首先導入 webdriver 模塊。然后使用help函數

from selenium import webdriver help(webdriver)

?

?

??

安裝

首先安裝 Selenium

pip install selenium

或者下載源碼

下載源碼

然后解壓后運行下面的命令進行安裝

python setup.py install

安裝好了之后我們便開始探索抓取方法了。

?

快速開始

??

初步體驗

聲明瀏覽器對象

上面我們知道了selenium支持很多的瀏覽器,但是如果想要聲明并調用瀏覽器則需要:

from selenium import webdriver browser = webdriver.Chrome() browser = webdriver.Firefox()

這里只寫了兩個例子,當然了其他的支持的瀏覽器都可以通過這種方式調用

一個例子感受一下 Selenium,這里用 Chrome 瀏覽器來測試,方便查看效果,到真正爬取的時候換回 PhantomJS 即可。

from selenium import webdriverbrowser = webdriver.Chrome() browser.get('http://www.baidu.com/')

運行這段代碼,會自動打開瀏覽器,然后訪問百度。

如果程序執行錯誤,瀏覽器沒有打開,那么應該是沒有裝 Chrome 瀏覽器或者 Chrome 驅動沒有配置在環境變量里。下載驅動,然后將驅動文件路徑配置在環境變量即可。

安裝三大瀏覽器驅動driver
? ? ? ? 1. chromedriver 下載地址:http://chromedriver.chromium.org
? ? ? ? ? ? chromedriver 鏡像下載地址 :http://npm.taobao.org/mirrors/chromedriver
? ? ? ? 2. Firefox 的驅動 geckodriver 下載地址:https://github.com/mozilla/geckodriver/releases
? ? ? ? 3. IE 的驅動 IEdriver 下載地址:http://www.nuget.org/packages/Selenium.WebDriver.IEDriver

注意:下載解壓后,將chromedriver.exe , geckodriver.exe , Iedriver.exe發到Python的安裝目錄,例如 D:\python 。 然后再將Python的安裝目錄添加到系統環境變量的Path下面。

爬蟲 Selenium Chromium 與 Chromedriver對應版本( 注意是 chromium,不是 Chrome ):
淘寶鏡像地址在每個文件夾的 notes.txt 中存有 chromium 和 Chromedriver 的版本對應(一般3個chromium版本對應1個Chromedriver 版本)。

chromium????chromedriver
v64-66v2.37
v63-65v2.36
v62-64v2.35
v61-63v2.34
v60-62v2.33

然后打開Python IDLE分別輸入以下代碼來啟動不同的瀏覽器

啟動谷歌瀏覽器
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('http://www.baidu.com/')

啟動火狐瀏覽器
from selenium import webdriver
browser = webdriver.Firefox()
browser.get('http://www.baidu.com/')

啟動IE瀏覽器
from selenium import webdriver
browser = webdriver.Ie()
browser.get('http://www.baidu.com/')

?

?

模擬提交

下面的代碼實現了“模擬百度提交搜索”的功能。首先等頁面加載完成,然后輸入關鍵字到搜索框文本,最后點擊提交。

from selenium import webdriver from selenium.webdriver.common.keys import Keysdriver = webdriver.Chrome() driver.get("http://www.baidu.com") print driver.title elem = driver.find_element_by_name("wd") # 百度首頁搜索框 name="wd" elem.send_keys("MM") # 輸入關鍵字 elem.send_keys(Keys.RETURN) # 模擬 點擊 enter鍵,提交 print driver.page_source # 打印 js 渲染后的網頁

?

? ? ? ? 其中 driver.get 方法會打開請求的URL,WebDriver 會等待頁面完全加載完成之后才會返回,即程序會等待頁面的所有內容加載完成,JS渲染完畢之后才繼續往下執行。注意:如果這里用到了特別多的 Ajax 的話,程序可能不知道是否已經完全加載完畢。

? ? ? ? WebDriver 提供了許多尋找網頁元素的方法,譬如 find_element_by_* 的方法。例如一個輸入框可以通過 ?find_element_by_name 方法尋找 name 屬性來確定。

? ? ? ? 然后我們輸入來文本然后模擬點擊了回車,就像我們敲擊鍵盤一樣。我們可以利用 Keys 這個類來模擬鍵盤輸入。

? ? ? ? 注意:獲取網頁渲染后的源代碼。輸出 page_source 屬性即可。這樣,就可以做到網頁的動態爬取了。? ? ? ??

? ? ? ? ? ? ? ? ? ?如果想知道更過代碼中driver對象有那些方法,可以通過 dir(driver) 查看

??

測試用例

import unittest from selenium import webdriver from selenium.webdriver.common.keys import Keysclass PythonOrgSearch(unittest.TestCase):def setUp(self):self.driver = webdriver.Chrome()def test_search_in_python_org(self):driver = self.driverdriver.get("http://www.python.org")self.assertIn("Python", driver.title)elem = driver.find_element_by_name("q")elem.send_keys("pycon")elem.send_keys(Keys.RETURN)assert "No results found." not in driver.page_sourcedef tearDown(self):self.driver.close()if __name__ == "__main__":unittest.main()

運行程序,同樣的功能,我們將其封裝為測試標準類的形式。

? ? ? ? The test case class is inherited from unittest.TestCase. Inheriting from TestCase class is the way to tell unittest module that this is a test case. The setUp is part of initialization, this method will get called before every test function which you are going to write in this test case class. The test case method should always start with characters test. The tearDown method will get called after every test method. This is a place to do all cleanup actions. You can also call quit method instead of close. The quit will exit the entire browser, whereas close will close a tab, but if it is the only tab opened, by default most browser will exit entirely.

? ? ? ? 測試用例是繼承了 unittest.TestCase 類,繼承這個類表明這是一個測試類。setUp方法是初始化的方法,這個方法會在每個測試類中自動調用。每一個測試方法命名都有規范,必須以 test 開頭,會自動執行。最后的 tearDown 方法會在每一個測試方法結束之后調用。這相當于最后的析構方法。在這個方法里寫的是 close 方法,你還可以寫 quit 方法。不過 close 方法相當于關閉了這個 TAB 選項卡,然而 quit 是退出了整個瀏覽器。當你只開啟了一個 TAB 選項卡的時候,關閉的時候也會將整個瀏覽器關閉。

driver = webdriver.Chrome() driver.maximize_window() # 最大化瀏覽器 driver.implicitly_wait(20) # 設置隱式時間等待 access_url = 'https://www.baidu.com' driver.get(access_url)element_login = driver.find_element_by_id('login') # 網頁的登錄按鈕 element_login.click() # 點擊登錄按鈕 sleep(2) # 顯式等待 2slinks = driver.find_element_by_tag_name('a') # 查找所有的 a 標簽 link = links[3] # 提取 第四個 a 標簽 link.click() # 點擊 提取 的 a 標簽

??

?

Selenium常見元素定位方法和操作的學習介紹https://blog.csdn.net/eastmount/article/details/48108259

Selenium切換窗口句柄及調用Chrome瀏覽器:https://blog.csdn.net/eastmount/article/details/53253278

??

?

頁面操作

?

訪問頁面??

from selenium import webdriverbrowser = webdriver.Chrome()browser.get("http://www.baidu.com") print(browser.page_source) browser.close()

上述代碼運行后,會自動打開Chrome瀏覽器,并登陸百度打印百度首頁的源代碼,然后關閉瀏覽器

?

?

查找元素

查找單個元素

from selenium import webdriverbrowser = webdriver.Chrome()browser.get("http://www.taobao.com") input_first = browser.find_element_by_id("q") input_second = browser.find_element_by_css_selector("#q") input_third = browser.find_element_by_xpath('//*[@id="q"]') print(input_first) print(input_second) print(input_third) browser.close()

這里通過三種不同的方式去獲取響應的元素,第一種是通過id的方式,第二個中是CSS選擇器,第三種是xpath選擇器,結果都是相同的。

?

查找元素的方法

Selenium提供了8種定位方式:id、name、class name、tag name、link text、partial link text、xpath、css selector。

這8種定位方式在Python selenium中所對應的方法為:

查找? 單個元素? 的? 方法

find_element_by_id()
find_element_by_name()
find_element_by_class_name()
find_element_by_tag_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_xpath()
find_element_by_css_selector()

查找? 多個元素? 的? 方法
find_elements_by_name
find_elements_by_id
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

?

下面這種方式是比較通用的一種方式:這里需要記住By模塊所以需要導入

from selenium.webdriver.common.by import By

from selenium import webdriverfrom selenium.webdriver.common.by import Bybrowser = webdriver.Chrome()browser.get("http://www.taobao.com") input_first = browser.find_element(By.ID,"q") print(input_first) browser.close()

當然這種方法和上述的方式是通用的,browser.find_element(By.ID,"q")這里By.ID中的ID可以替換為其他幾個

?

多個元素查找

其實多個元素和單個元素的區別,舉個例子:find_elements,單個元素是find_element,其他使用上沒什么區別,通過其中的一個例子演示:

from selenium import webdriverbrowser = webdriver.Chrome() browser.get("http://www.taobao.com") lis = browser.find_elements_by_css_selector('.service-bd li') print(lis) browser.close()

這樣獲得就是一個列表

當然上面的方式也是可以通過導入from selenium.webdriver.common.by import By 這種方式實現

lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')

??

頁面交互

玩轉python selenium鼠標鍵盤操作(ActionChains):https://www.jb51.net/article/92682.htm
Selenium鼠標與鍵盤事件常用操作方法示例:https://www.jb51.net/article/145502.htm

? ? ? ? 僅僅抓取頁面沒有多大卵用,我們真正要做的是做到和頁面交互,比如點擊,輸入等等。那么前提就是要找到頁面中的元素。WebDriver提供了各種方法來尋找元素。例如下面有一個表單輸入框。

<input type="text" name="passwd" id="passwd-id" />

我們可以這樣獲取它

element = driver.find_element_by_id("passwd-id") element = driver.find_element_by_name("passwd") element = driver.find_elements_by_tag_name("input") element = driver.find_element_by_xpath("//input[@id='passwd-id']")

? ? ? ? 你還可以通過它的文本鏈接來獲取,但是要小心,文本必須完全匹配才可以,所以這并不是一個很好的匹配方式。

? ? ? ? 而且你在用 xpath 的時候還需要注意的是,如果有多個元素匹配了 xpath,它只會返回第一個匹配的元素。如果沒有找到,那么會拋出?NoSuchElementException 的異常。

? ? ? ? 獲取了元素之后,下一步當然就是向文本輸入內容了,可以利用下面的方法

element.send_keys("some text")

同樣你還可以利用 Keys 這個類來模擬點擊某個按鍵。

element.send_keys("and some", Keys.ARROW_DOWN)

? ? ? ? 你可以對任何獲取到到元素使用 send_keys 方法,就像你在 GMail 里面點擊發送鍵一樣。不過這樣會導致的結果就是輸入的文本不會自動清除。所以輸入的文本都會在原來的基礎上繼續輸入。你可以用下面的方法來清除輸入文本的內容。

element.clear()

這樣輸入的文本會被清除。

對于獲取的元素調用交互方法

from selenium import webdriverimport timebrowser = webdriver.Chrome() browser.get("http://www.taobao.com") input_str = browser.find_element_by_id('q') input_str.send_keys("ipad") time.sleep(1) input_str.clear() input_str.send_keys("MakBook pro") button = browser.find_element_by_class_name('btn-search') button.click()

運行的結果可以看出程序會自動打開Chrome瀏覽器并打開淘寶輸入ipad,然后刪除,重新輸入MakBook pro,并點擊搜索

?

Selenium所有的api文檔:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

?

交互動作

將動作附加到動作鏈中串行執行

from selenium import webdriver from selenium.webdriver import ActionChainsbrowser = webdriver.Chrome()url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable" browser.get(url) browser.switch_to.frame('iframeResult') source = browser.find_element_by_css_selector('#draggable') target = browser.find_element_by_css_selector('#droppable')actions = ActionChains(browser) actions.drag_and_drop(source, target) actions.perform()actions.drag_and_drop_by_offset(source, 400, 0).perform()

更多操作參考:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

?

執行JavaScript

這是一個非常有用的方法,這里就可以直接調用js方法來實現一些操作,下面的例子是通過登錄知乎然后通過js翻到頁面底部,并彈框提示

?

from selenium import webdriver browser = webdriver.Chrome() browser.get("http://www.zhihu.com/explore") browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("To Bottom")')

獲取元素屬性

get_attribute('class')

from selenium import webdriverbrowser = webdriver.Chrome() url = 'https://www.zhihu.com/explore' browser.get(url) logo = browser.find_element_by_id('zh-top-link-logo') print(logo) print(logo.get_attribute('class'))

獲取文本值

text

from selenium import webdriverbrowser = webdriver.Chrome() url = 'https://www.zhihu.com/explore' browser.get(url) input = browser.find_element_by_class_name('zu-top-add-question') print(input.text)

獲取ID,位置,標簽名

?

id、location、tag_name、size

from selenium import webdriverbrowser = webdriver.Chrome() url = 'https://www.zhihu.com/explore' browser.get(url) input = browser.find_element_by_class_name('zu-top-add-question') print(input.id) print(input.location) print(input.tag_name) print(input.size)

??

填充表單

我們已經知道了怎樣向文本框中輸入文字,但是其它的表單元素呢?例如下拉選項卡的的處理可以如下

element = driver.find_element_by_xpath("//select[@name='name']") all_options = element.find_elements_by_tag_name("option") for option in all_options:print("Value is: %s" % option.get_attribute("value"))option.click()

? ? ? ? 首先獲取了第一個 select 元素,也就是下拉選項卡。然后輪流設置了 select 選項卡中的每一個 option 選項。你可以看到,這并不是一個非常有效的方法

? ? ? ? ? ??其實 WebDriver 中提供了一個叫 Select 的方法,可以幫助我們完成這些事情。

from selenium.webdriver.support.ui import Select select = Select(driver.find_element_by_name('name')) select.select_by_index(index) select.select_by_visible_text("text") select.select_by_value(value)

如你所見,它可以根據索引來選擇,可以根據值來選擇,可以根據文字來選擇。是十分方便的。

全部取消選擇怎么辦呢?很簡單

select = Select(driver.find_element_by_id('id')) select.deselect_all()

這樣便可以取消所有的選擇。

另外我們還可以通過下面的方法獲取所有的已選選項。

select = Select(driver.find_element_by_xpath("xpath")) all_selected_options = select.all_selected_options

獲取所有可選選項是

options = select.options

如果你把表單都填好了,最后肯定要提交表單對吧。怎嗎提交呢?很簡單

driver.find_element_by_id("submit").click()

這樣就相當于模擬點擊了 submit 按鈕,做到表單提交。

當然你也可以單獨提交某個元素

element.submit()

方法,WebDriver 會在表單中尋找它所在的表單,如果發現這個元素并沒有被表單所包圍,那么程序會拋出 NoSuchElementException 的異常。

??

元素拖拽

要完成元素的拖拽,首先你需要指定被拖動的元素和拖動目標元素,然后利用 ActionChains 類來實現

element = driver.find_element_by_name("source") target = driver.find_element_by_name("target")from selenium.webdriver import ActionChains action_chains = ActionChains(driver) action_chains.drag_and_drop(element, target).perform() actions.drag_and_drop_by_offset(element, 400, 0).perform()

這樣就實現了元素從 source 拖動到 target 的操作

?

Frame

在很多網頁中都是有Frame標簽,所以我們爬取數據的時候就涉及到切入到frame中以及切出來的問題,通過下面的例子演示
這里常用的是switch_to.from()和switch_to.parent_frame()

import time from selenium import webdriver from selenium.common.exceptions import NoSuchElementExceptionbrowser = webdriver.Chrome() url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult') source = browser.find_element_by_css_selector('#draggable') print(source) try:logo = browser.find_element_by_class_name('logo') except NoSuchElementException:print('NO LOGO') browser.switch_to.parent_frame() logo = browser.find_element_by_class_name('logo') print(logo) print(logo.text)

??

頁面切換 和 打開新窗口

如果在一個頁面上點擊一個鏈接之后,并不是在當前頁面上打開,而是重新打開一個新頁面;這種情況下如何跳轉到新的頁面上操作?首先,需要了解的是每個窗口都有句柄的,可以理解為瀏覽器窗口的唯一標識符,根據這個標識符來確定新打開的窗口。打開新頁面后,selenium 的 focus 還是在 原來的頁面上,所以需要使用?switch_to.window?方法把 焦點(focus) 切換到新頁面上

如果是新打開的 iframe 就使用 switch_to_frame('xxx')
如果是新打開的 tab 就使用 switch_to_window('')

一個瀏覽器肯定會有很多窗口,所以我們肯定要有方法來實現窗口的切換。切換窗口的方法如下

driver.switch_to_window("windowName")

switch_to_window 方法現在已經廢棄,鼠標放在這個方法上提示 使用 switch_to.window 代替

另外你可以使用 window_handles 方法來獲取每個窗口的操作對象。例如

for handle in driver.window_handles:driver.switch_to_window(handle)

另外切換 frame 的方法如下

driver.switch_to_frame("frameName.0.child")

這樣焦點會切換到一個 name 為 child 的 frame 上。

打開新窗口主要使用 JavaScript 實現:

# 新標簽頁打開這個url js="window.open("url")" driver.execute_script(js) time.sleep(2)

Python+Selenium練習篇之27-多窗口之間切換 :https://blog.csdn.net/u011541946/article/details/70132672
python selenium打開新窗口,多窗口切換:https://blog.csdn.net/DongGeGe214/article/details/52169761
python/selenium/chrome打開新窗口并實現窗口切換:?https://blog.csdn.net/zwq912318834/article/details/79206953

selenium之 定位以及切換frame(iframe):https://blog.csdn.net/huilan_same/article/details/52200586

selenium iframe 切換

?

chrome瀏覽器打開標簽頁的快捷鍵是ctrl+t,那把ctrl+t的按鍵事件傳入即可,很多種實現方式,以下只列出兩種:

1:
Actions actionOpenLinkInNewTab = new Actions(driver);
actionOpenLinkInNewTab.keyDown(Keys.CONTROL).sendKeys("t").keyUp(Keys.CONTROL).perform();

2:
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");

示例代碼:

from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Firefox() # 默認的火狐瀏覽器 for i in range(5):# 這句代碼相當于在瀏覽器窗口下按下ctrl+t打開一個新的標簽頁driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't') time.sleep(10) # 等待所有窗口完全打開,10秒夠用了, 如果不打開得不到所有句柄,只能得到部分。 handles = driver.window_handles print(len(handles)) print(handles)

通常要確保頁面加載完成,可以使用 selenium.webdriver.support.ui.WebDriverWait?

?

打開新窗口示例代碼:

from selenium import webdriver # 打開谷歌瀏覽器 browser = webdriver.Chrome()# 打開窗口 browser.get("https://www.baidu.com/") # 打開新窗口 newwindow_js = 'window.open("https://www.baidu.com");' # js browser.execute_script(newwindow_js) # 執行 js 打開新的頁面 # 切換到新的窗口 handles = browser.window_handles # 得到 所有頁面 句柄 browser.switch_to_window(handles[-1]) # 切換焦點到 對應頁面

?

選項卡管理

通過執行js命令實現新開選項卡window.open()
不同的選項卡是存在列表里browser.window_handles
通過browser.window_handles[0]就可以操作第一個選項卡

?

import time from selenium import webdriverbrowser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.execute_script('window.open()') print(browser.window_handles) browser.switch_to_window(browser.window_handles[1]) browser.get('https://www.taobao.com') time.sleep(1) browser.switch_to_window(browser.window_handles[0]) browser.get('https://python.org')

?

彈窗處理

當你出發了某個事件之后,頁面出現了彈窗提示,那么你怎樣來處理這個提示或者獲取提示信息呢?

alert = driver.switch_to_alert()

通過上述方法可以獲取彈窗對象。

??

歷史記錄

那么怎樣來操作頁面的前進和后退功能呢?(前進 和 后退 針對的是 瀏覽器瀏覽的網頁 的 歷史記錄)

driver.forward() driver.back()

??

Cookies處理

get_cookies()
delete_all_cookes()
add_cookie()

from selenium import webdriverbrowser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'zhaofan'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies())

為頁面添加 Cookies,用法如下

# Go to the correct domain driver.get("http://www.example.com")# Now set the cookie. This one's valid for the entire domain cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’} driver.add_cookie(cookie)

獲取頁面 Cookies,用法如下

# Go to the correct domain driver.get("http://www.example.com")# And now output all the available cookies for the current URL driver.get_cookies()

以上便是 Cookies 的處理,同樣是非常簡單的。

??

元素選取

關于元素的選取,有如下的API。

單個元素選取

find_element_by_id find_element_by_name find_element_by_xpath find_element_by_link_text find_element_by_partial_link_text find_element_by_tag_name find_element_by_class_name find_element_by_css_selector

多個元素選取

find_elements_by_name find_elements_by_xpath find_elements_by_link_text find_elements_by_partial_link_text find_elements_by_tag_name find_elements_by_class_name find_elements_by_css_selector

另外還可以利用 By 類來確定哪種選擇方式

from selenium.webdriver.common.by import Bydriver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button')

By 類的一些屬性如下

ID = "id" XPATH = "xpath" LINK_TEXT = "link text" PARTIAL_LINK_TEXT = "partial link text" NAME = "name" TAG_NAME = "tag name" CLASS_NAME = "class name" CSS_SELECTOR = "css selector"

更詳細的元素選擇方法參見官方文檔

元素選擇

??

??

頁面等待

?

Python selenium 三種等待方式詳解(必會):https://www.jb51.net/article/92672.htm

? ? ? ? 這是非常重要的一部分,現在的網頁越來越多采用了 Ajax 技術,這樣程序便不能確定何時某個元素完全加載出來了。這會讓元素定位困難而且會提高產生 ElementNotVisibleException 的概率。所以 Selenium 提供了兩種等待方式,一種是隱式等待,一種是顯式等待。

? ? ? ? 隱式等待?是 等待特定的時間。顯式等待 是 指定某一條件直到這個條件成立時繼續執行。當使用了隱式等待執行測試的時候,如果 WebDriver沒有在 DOM中找到元素,將繼續等待,超出設定時間后則拋出找不到元素的異常, 換句話說,當查找元素或元素并沒有立即出現的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是0

?

顯式等待

首先指定一個等待條件,并且再指定一個最長等待時間,然后在這個時間段內進行判斷是否滿足等待條件,如果成立就會立即返回,如果不成立,就會一直等待,直到等待你指定的最長等待時間,如果還是不滿足,就會拋出異常,如果滿足了就會正常返回

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 ECdriver = webdriver.Chrome() driver.get("http://somedomain/url_that_delays_loading") try:element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "myDynamicElement"))) finally:driver.quit()

程序默認會 500ms 調用一次來查看元素是否已經生成,如果本來元素就是存在的,那么會立即返回。

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 ECbrowser = webdriver.Chrome() browser.get('https://www.taobao.com/') wait = WebDriverWait(browser, 10) input = wait.until(EC.presence_of_element_located((By.ID, 'q'))) button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search'))) print(input, button)

上述的例子中的條件:EC.presence_of_element_located()是確認元素是否已經出現了
EC.element_to_be_clickable()是確認元素是否是可點擊的

?

?

?

下面是一些內置的等待條件,你可以直接調用這些條件,而不用自己寫某些等待條件了。

?

常用的判斷條件:
title_is? ? ? ? ? ? ? ? ? ? 標題是某內容
title_contains? ? ? ? ? 標題包含某內容
presence_of_element_located? ? ? 元素加載出,傳入定位元組,如(By.ID, 'p')
visibility_of_element_located? ? ? ?元素可見,傳入定位元組
visibility_of? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?可見,傳入元素對象
presence_of_all_elements_located? ? ? ? ? ? 所有元素加載出
text_to_be_present_in_element? ? ? ? ? ? ? ? 某個元素文本包含某文字
text_to_be_present_in_element_value? ? ? 某個元素值包含某文字
frame_to_be_available_and_switch_to_it frame? ? ? 加載并切換
invisibility_of_element_located? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 元素不可見
element_to_be_clickable? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?元素可點擊
staleness_of? ? ? ? ? ? ? ? ? ? ? ? 判斷一個元素是否仍在DOM,可判斷頁面是否已經刷新
element_to_be_selected? ? ? ?元素可選擇,傳元素對象
element_located_to_be_selected 元素可選擇,傳入定位元組
element_selection_state_to_be 傳入元素對象以及狀態,相等返回True,否則返回False
element_located_selection_state_to_be 傳入定位元組以及狀態,相等返回True,否則返回False
alert_is_present 是否出現Alert

更多操作參考:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

from selenium.webdriver.support import expected_conditions as ECwait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))

??

隱式等待

隱式等待比較簡單,就是簡單地設置一個等待時間,單位為秒。到了一定的時間發現元素還沒有加載,則繼續等待我們指定的時間,如果超過了我們指定的時間還沒有加載就會拋出異常,如果沒有需要等待的時候就已經加載完畢就會立即執行

from selenium import webdriverdriver = webdriver.Chrome() driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement")

當然如果不設置,默認等待時間為0。

from selenium import webdriverbrowser = webdriver.Chrome() browser.implicitly_wait(10) browser.get('https://www.zhihu.com/explore') input = browser.find_element_by_class_name('zu-top-add-question') print(input)

?

瀏覽器的前進和后退

?

back()
forward()??

import time from selenium import webdriverbrowser = webdriver.Chrome() browser.get('https://www.baidu.com/') browser.get('https://www.taobao.com/') browser.get('https://www.python.org/') browser.back() time.sleep(1) browser.forward() browser.close()

?

?

異常處理

這里的異常比較復雜,官網的參考地址:
http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions
這里只進行簡單的演示,查找一個不存在的元素

from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElementExceptionbrowser = webdriver.Chrome() try:browser.get('https://www.baidu.com') except TimeoutException:print('Time Out') try:browser.find_element_by_id('hello') except NoSuchElementException:print('No Element') finally:browser.close()

?

??

?

程序框架

??

對于頁面測試和分析,官方提供了一個比較明晰的代碼結構,可以參考。

頁面測試架構

??

??

API

??

到最后,肯定是放松最全最重要的API了,比較多,希望大家可以多加練習。

API

?

?

?

Selenium 用法詳解

?

來源:https://www.cnblogs.com/themost/p/6900852.html

?

selenium用法詳解

?

?

selenium主要是用來做自動化測試,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。模擬瀏覽器進行網頁加載,當requests,urllib無法正常獲取網頁內容的時候

一、聲明瀏覽器對象

? ? ? ? ?注意點一,Python文件名或者包名不要命名為selenium,會導致無法導入

from selenium import webdriver #webdriver可以認為是瀏覽器的驅動器,要驅動瀏覽器必須用到webdriver,支持多種瀏覽器,這里以Chrome為例 browser = webdriver.Chrome()

二、訪問頁面并獲取網頁html

from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.taobao.com') print(browser.page_source)#browser.page_source是獲取網頁的全部html browser.close()

三、查找元素? ? ? ??

? ? # 單個元素 常用的查找方法
? ? ? ??find_element_by_name
? ? ? ??find_element_by_xpath
? ? ? ??find_element_by_link_text
? ? ? ??find_element_by_partial_link_text
? ? ? ??find_element_by_tag_name
? ? ? ??find_element_by_class_name
? ? ? ??find_element_by_css_selector
? ? # 多個元素,elements多個s
? ? ? ? input_first = browser.find_elements_by_id('q')

from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.taobao.com') input_first = browser.find_element_by_id('q') input_second = browser.find_element_by_css_selector('#q') input_third = browser.find_element_by_xpath('//*[@id="q"]') print(input_first,input_second,input_third) browser.close()# 也可以使用通用的方法 from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('https://www.taobao.com') input_first = browser.find_element(BY.ID,'q')#第一個參數傳入名稱,第二個傳入具體的參數 print(input_first) browser.close()

四、元素交互操作-搜索框傳入關鍵詞進行自動搜索

from selenium import webdriver import time browser = webdriver.Chrome() browser.get('https://www.taobao.com') input = browser.find_element_by_id('q') # 找到搜索框 input.send_keys('iPhone') # 傳送入關鍵詞 time.sleep(5) input.clear() # 清空搜索框 input.send_keys('MM') button = browser.find_element_by_class_name('btn-search') # 找到搜索按鈕 button.click()

更多操作: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement#可以有屬性、截圖等等

五、交互動作,驅動瀏覽器進行動作,模擬拖拽動作,將動作附加到動作鏈中串行執行

from selenium import webdriver from selenium.webdriver import ActionChains#引入動作鏈browser = webdriver.Chrome() url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult')#切換到iframeResult框架 source = browser.find_element_by_css_selector('#draggable')#找到被拖拽對象 target = browser.find_element_by_css_selector('#droppable')#找到目標 actions = ActionChains(browser)#聲明actions對象 actions.drag_and_drop(source, target) actions.perform()#執行動作

更多操作: http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

?

六、執行JavaScript

有些動作可能沒有提供api,比如進度條下拉,這時,我們可以通過代碼執行JavaScript

from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("To Bottom")')

七、獲取元素信息

# 獲取屬性 from selenium import webdriver from selenium.webdriver import ActionChainsbrowser = webdriver.Chrome() url = 'https://www.zhihu.com/explore' browser.get(url) logo = browser.find_element_by_id('zh-top-link-logo')#獲取網站logo print(logo) print(logo.get_attribute('class')) browser.close()# 獲取文本值 from selenium import webdriver browser = webdriver.Chrome() url = 'https://www.zhihu.com/explore' browser.get(url) input = browser.find_element_by_class_name('zu-top-add-question') print(input.text)#input.text文本值 browser.close()# 獲取Id,位置,標簽名,大小 from selenium import webdriver browser = webdriver.Chrome() url = 'https://www.zhihu.com/explore' browser.get(url) input = browser.find_element_by_class_name('zu-top-add-question') print(input.id) # 獲取id print(input.location) # 獲取位置 print(input.tag_name) # 獲取標簽名 print(input.size) # 獲取大小 browser.close()

八、Frame操作(即 一個html網頁中 嵌套 另一個html網頁)

frame相當于獨立的網頁,如果在父類網frame查找子類的,則必須切換到子類的frame,子類如果查找父類也需要先切換

from selenium import webdriver from selenium.common.exceptions import NoSuchElementExceptionbrowser = webdriver.Chrome() url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable' browser.get(url) browser.switch_to.frame('iframeResult') source = browser.find_element_by_css_selector('#draggable') print(source) try:logo = browser.find_element_by_class_name('logo') except NoSuchElementException:print('NO LOGO') browser.switch_to.parent_frame() logo = browser.find_element_by_class_name('logo') print(logo) print(logo.text)

九、等待

隱式等待:當使用了隱式等待執行測試的時候,如果 WebDriver沒有在 DOM中找到元素,將繼續等待,超出設定時間后則拋出找不到元素的異常。換句話說,當查找元素或元素并沒有立即出現的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是0

from selenium import webdriverbrowser = webdriver.Chrome() browser.implicitly_wait(10)#等待十秒加載不出來就會拋出異常,10秒內加載出來正常返回 browser.get('https://www.zhihu.com/explore') input = browser.find_element_by_class_name('zu-top-add-question') print(input)

顯式等待:指定一個等待條件,和一個最長等待時間,程序會判斷在等待時間內條件是否滿足,如果滿足則返回,如果不滿足會繼續等待,超過時間就會拋出異常

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 ECbrowser = webdriver.Chrome() browser.get('https://www.taobao.com/') wait = WebDriverWait(browser, 10) input = wait.until(EC.presence_of_element_located((By.ID, 'q'))) button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search'))) print(input, button)

常用屬性

title_is? ? ? ? ? ? ?標題是某內容
title_contains? ? ? ?標題包含某內容
presence_of_element_located? ? ? 元素加載出,傳入定位元組,如(By.ID, 'p')
visibility_of_element_located? ? 元素可見,傳入定位元組
visibility_of? ? ? ? ? ? ? ? ? ? 可見,傳入元素對象
presence_of_all_elements_located 所有元素加載出
text_to_be_present_in_element? ? 某個元素文本包含某文字
text_to_be_present_in_element_value? ? 某個元素值包含某文字
frame_to_be_available_and_switch_to_it frame? ? ?加載并切換
invisibility_of_element_located? ? ? ? ? ? ? ? ? 元素不可見
element_to_be_clickable? ? ? ? ? ? ? ? ? ? ? ? ? 元素可點擊
staleness_of? ? ? ? ? ? ? ? ? ? ? ? ? 判斷一個元素是否仍在DOM,可判斷頁面是否已經刷新
element_to_be_selected? ? ? ? ? ? ? ? 元素可選擇,傳元素對象
element_located_to_be_selected? ? ? ? 元素可選擇,傳入定位元組
element_selection_state_to_be? ? ? ? ?傳入元素對象以及狀態,相等返回True,否則返回False
element_located_selection_state_to_be 傳入定位元組以及狀態,相等返回True,否則返回False
alert_is_present? ? ? ? ? ? ? ? ? ? ? 是否出現Alert

詳細內容:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

十一、前進后退-實現瀏覽器的前進后退以瀏覽不同的網頁

import time from selenium import webdriverbrowser = webdriver.Chrome() browser.get('https://www.baidu.com/') browser.get('https://www.taobao.com/') browser.get('https://www.python.org/') browser.back() time.sleep(1) browser.forward() browser.close()

十二、Cookies

from selenium import webdriverbrowser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') print(browser.get_cookies()) browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'}) print(browser.get_cookies()) browser.delete_all_cookies() print(browser.get_cookies())

選項卡管理 增加瀏覽器窗口

import time from selenium import webdriverbrowser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.execute_script('window.open()') print(browser.window_handles) browser.switch_to_window(browser.window_handles[1]) browser.get('https://www.taobao.com') time.sleep(1) browser.switch_to_window(browser.window_handles[0]) browser.get('http://www.fishc.com')

十三、異常處理

from selenium import webdriverbrowser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.find_element_by_id('hello')from selenium import webdriver from selenium.common.exceptions import TimeoutException, NoSuchElementExceptionbrowser = webdriver.Chrome() try:browser.get('https://www.baidu.com') except TimeoutException:print('Time Out') try:browser.find_element_by_id('hello') except NoSuchElementException:print('No Element') finally:browser.close()

# 詳細文檔:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions

?

?

?

Chrome headless

?

什么是 Headless Chrome

Headless Chrome 是 Chrome 瀏覽器的無界面形態,可以在不打開瀏覽器的前提下,使用所有 Chrome 支持的特性運行你的程序。相比于現代瀏覽器,Headless Chrome 更加方便測試 web 應用,獲得網站的截圖,做爬蟲抓取信息等。相比于較早的 PhantomJS,SlimerJS 等,Headless Chrome 則更加貼近瀏覽器環境。

?

Headless Chrome作用

為了提高selenium腳本的執行速度,我們可能會考慮使用PhantomJS這類的Headless 瀏覽器,但這些工具對JavaScript支持不好或者對web的支持不好,占用資源多,跟真實瀏覽器存在一定的差異等等問題。Chrome 瀏覽器提供的Headless Chrome,簡單說我們也可以在不打開chrome GUI的情況在Chrome下執行我們的Selenium腳本,可提升腳本的執行效率。

?

Headless Chrome 對Chrome版本要求

官方文檔中介紹,mac 和linux 環境要求 chrome 版本是 59+,而 windows 版本的 chrome 要求是 60+

如果想進一步了解 headless,請移步官網:https://developers.google.cn/web/updates/2017/04/headless-chrome

?

使用

? ? 1. 首先需要下載 Chrome 瀏覽器(推薦使用 Chrome Canary版本) 。

? ? 2. 下載?selenium 驅動 Chrome 的驅動(chromedriver 鏡像 :http://npm.taobao.org/mirrors/chromedriver/)

? ? ? ? ?注意 版本問題,可以根據時間下載最新的 Chrome 驅動

? ? 3. 添加 Chrome 驅動的環境變量,或者直接把 Chrome 驅動放在 python 的安裝目錄下

? ? ? ? (因為 python 已經設置環境變量,所以可以直接放在 python安裝目錄下即可)

?

示例代碼:

from selenium import webdriver from selenium.common.exceptions import NoSuchElementException import selenium.webdriver.support.ui as ui # from selenium.webdriver.common.action_chains import ActionChainschrome_options = webdriver.ChromeOptions() # chrome_options.add_argument('--headless') browser = webdriver.Chrome(chrome_options=chrome_options) # 打開瀏覽器 設定等待加載時間 訪問URL wait = ui.WebDriverWait(browser, 10)def test_1():browser.get('https://www.baidu.com/')print('打開瀏覽器')print(browser.title)browser.find_element_by_id('kw').send_keys('測試')print('關閉')browser.quit()print('測試完成')def test_2():url = "https://www.newrank.cn/public/info/list.html?period=pgcweek&type=data"browser.get(url)print(browser.page_source) # 打印渲染后的頁面代碼def test_3():url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'browser.get(url)browser.switch_to.frame('iframeResult') # 切換到 嵌套的 html 頁面source = browser.find_element_by_css_selector('#draggable')print(source)try:logo = browser.find_element_by_class_name('logo')except NoSuchElementException:print('NO LOGO')browser.switch_to.parent_frame() # 返回到父 html 頁面logo = browser.find_element_by_class_name('logo')print(logo)print(logo.text)if __name__ == "__main__":test_1()test_2()test_3()pass

運行結果截圖:

使用 示例 :

#!/usr/bin/python3 # -*- coding: utf-8 -*- # @Author : # @File : test.py # @Software : PyCharm # @description : XXXimport time from selenium import webdriver from selenium.common.exceptions import NoSuchElementException, TimeoutException # from selenium.common.exceptions import from selenium.webdriver.support.ui import WebDriverWait # available since from selenium.webdriver.common.keys import Keysdef is_element_exist(driver, css):find_elements = driver.find_elements_by_css_selector(css_selector=css)if len(find_elements) == 0:print("元素未找到:%s" % css)return Falseelif len(find_elements) == 1:return Trueelse:print("找到%s個元素:%s" % (len(find_elements), css))return Falsedef test():driver = webdriver.Chrome()print("加載驅動完成..")# 設置 隱式等待時間driver.implicitly_wait(10)driver.get("https://ww.baidu.com") # 加載頁面print("加載頁面完成..")time.sleep(1)# 方法一try:assert "百度一下" in driver.titleprint('斷言 百度 標題 成功')except Exception as e:print('斷言 百度 標題 失敗', format(e))driver.maximize_window() # 瀏覽器全屏顯示print("最大化頁面窗口完成..")elem = driver.find_element_by_name("wd") # Find the query boxelem.send_keys("今日頭條" + Keys.RETURN)# elem.submit() 提交表單方法print("輸入搜索關鍵字...")time.sleep(1) # Let the page load, will be added to the API'''# driver.find_element_by_id("kw").clear()# driver.find_element_by_id("kw").send_keys(u"pyse自動化測試")# driver.type("//*[@id='kw']",u"pyse自動化測試")# driver.find_element_by_id("su").send_keys(Keys.ENTER)# driver.click("//*[@id='su']")# 也可定位登陸按鈕,通過enter(回車)代替click()# driver.find_element_by_id("su").send_keys(Keys.ENTER)'''# 方法一 采用包含判斷,建議第一種try:driver.find_element_by_xpath("//*[@id='su']")print("校驗通過,百度一下按鈕存在")except NoSuchElementException:assert 0, "校驗不通過"# raw_input() # 停止在當前光標處;# 方法二time.sleep(1)# 驗證 今日頭條_百度搜索 標題是否存在if "今日頭條_百度搜索" == driver.title:print('斷言 今日頭條 標題 成功')else:print('斷言 今日頭條 標題 失敗')print(driver.title)# raw_input() # 停止在當前光標處;# 更多驗證方法try:assert "今日頭條_百度搜索" in driver.titleprint(u"標題驗證 Pass")except AssertionError as e:print("找不到這個標題")# 判斷頁面上有無 id 為 kw 的元素if is_element_exist(driver, "#kw"):driver.find_element_by_id("kw").send_keys("")# 判斷頁面有無標簽為 input元素if is_element_exist(driver, "input"):driver.find_element_by_tag_name("input").send_keys("今日頭條 新聞")try:# we have to wait for the page to refresh, the last thing that seems to be updated is the titleWebDriverWait(driver, 10).until(lambda driver: driver.title.lower().startswith(""))# You should see "cheese! - Google Search"print(u"等待時間,打印當前頁面的標題 :" + driver.title)finally:print(u"-----> 請按Enter 鍵進行下一步操作...")input('press any key continue') # 停止在當前光標處;# driver.close()print(u"執行完成,即將關閉驅動...")driver.close()driver.quit() # 與close方法相同if __name__ == '__main__':test()

登錄百度賬號,并在 貼吧發帖:

import time from selenium import webdriver import selenium.webdriver.support.ui as ui from selenium.webdriver import ActionChains # from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.wait import WebDriverWait from selenium.common.exceptions import NoSuchElementException from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as ECclass LoginBD(object):def __init__(self):super(LoginBD, self).__init__()self.browser = Noneself.wait = Noneself.action_chains = Nonepassdef __del__(self):passdef init_chrome_browser(self):"""初始化 Chrome 瀏覽器:return:"""chrome_options = webdriver.ChromeOptions()# 啟動參數# chrome_options.add_argument('--headless')chrome_options.add_argument('disable-infobars')chrome_options.add_argument('--disable-gpu')chrome_options.add_argument("window-size=1024,768")chrome_options.add_argument("--no-sandbox")# mobile_emulation = {'deviceName': 'iPhone 6'}# chrome_options.add_experimental_option("mobileEmulation", mobile_emulation)# proxy_ip = 'http://127.0.0.1:8080'# chrome_options.add_argument("--proxy-server={0}".format(proxy_ip))########################################################################## http_proxy = "http://127.0.0.1:8080"# # 代理參數# desired_capabilities = options.to_capabilities()# desired_capabilities['acceptSslCerts'] = True# desired_capabilities['acceptInsecureCerts'] = True# desired_capabilities['proxy'] = {# "httpProxy": http_proxy,# "ftpProxy": http_proxy,# "sslProxy": http_proxy,# "noProxy": None,# "proxyType": "MANUAL",# "class": "org.openqa.selenium.Proxy",# "autodetect": False,# }########################################################################## 啟動瀏覽器self.browser = webdriver.Chrome(options=chrome_options)self.browser.maximize_window()# self.browser = webdriver.Chrome(chrome_options=options, desired_capabilities=desired_capabilities)# 打開瀏覽器 設定等待加載時間 訪問URLself.wait = WebDriverWait(self.browser, 10)# self.wait = ui.WebDriverWait(self.browser, 10)self.action_chains = ActionChains(self.browser)self.browser.delete_all_cookies()passdef login_bd(self):bd_url = 'https://www.baidu.com'self.init_chrome_browser()self.browser.get(bd_url)time.sleep(2)login_href_xpath = '//div[@id="u1"]/a[@name="tj_login"]'self.wait.until(EC.presence_of_all_elements_located((By.XPATH, login_href_xpath)))login_href = self.browser.find_element_by_xpath(login_href_xpath)login_href.click()p_element_xpath = '//p[@class="tang-pass-footerBarULogin pass-link"]'self.wait.until(EC.presence_of_all_elements_located((By.XPATH, p_element_xpath)))p_element = self.browser.find_element_by_xpath(p_element_xpath)p_element.click()input_username = self.browser.find_element_by_id('TANGRAM__PSP_10__userName')username = input('input username :')input_username.send_keys(username)input_password = self.browser.find_element_by_id('TANGRAM__PSP_10__password')password = input('input password :')input_password.send_keys(password)btn = self.browser.find_element_by_id('TANGRAM__PSP_10__submit')btn.click()a_span_element_xpath = '//a[@id="s_username_top"]/span'login_result = self.wait.until(EC.text_to_be_present_in_element((By.XPATH, a_span_element_xpath), username))if login_result:print('login success')else:print('login fail')passdef test(self):bar_url = 'https://tieba.baidu.com/f?ie=utf-8&kw={0}'.format('美女')self.browser.get(bar_url)js = "window.scrollTo(0, document.body.scrollHeight)"self.browser.execute_script(js)tie_tittle_xpath = '//input[@name="title"]'self.wait.until(EC.presence_of_all_elements_located((By.XPATH, tie_tittle_xpath)))tie_element = self.browser.find_element_by_xpath(tie_tittle_xpath)tittle_text = input('input tie tittle :')tie_element.send_keys(tittle_text)tie_content_xpath = '//div[@id="ueditor_replace"]'tie_content = self.browser.find_element_by_xpath(tie_content_xpath)tie_content_text = input('input tie content :')tie_content.send_keys(tie_content_text)btn_commit_xpath = '//button[@class="btn_default btn_middle j_submit poster_submit"]'btn_commit = self.browser.find_element_by_xpath(btn_commit_xpath)btn_commit.click()input('press any key to continue...')passdef main():temp = LoginBD()temp.login_bd()temp.test()if __name__ == "__main__":main()pass

運行截圖:

?

?

手動登錄淘寶后,用程序抓取商品信息。

使用 selenium 登錄淘寶時,可以被淘寶檢測 出來,所以手動登錄。

import time from selenium.webdriver import Chrome from selenium.webdriver import ChromeOptions from selenium.webdriver import ActionChains from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.keys import Keys from selenium.common.exceptions import TimeoutExceptiondef test_selenium():option = ChromeOptions()option.add_experimental_option('excludeSwitches', ['enable-automation'])browser = Chrome(options=option)browser.maximize_window()action_chains = ActionChains(browser)wait = WebDriverWait(browser, 5)username = '淘寶賬號'pwd = '淘寶密碼'url = 'https://login.taobao.com/member/login.jhtml'browser.get(url)# 鼠標移動,模擬人的行為action_chains.move_by_offset(random.randint(10, 60), random.randint(10, 60)).perform()qr_code_element = browser.find_element_by_xpath('//i[@id="J_Quick2Static"]')qr_code_element.click()user_name_element = browser.find_element_by_xpath('//input[@name="TPL_username"]')for ch in username:user_name_element.send_keys(ch)time.sleep(0.5)password_element = browser.find_element_by_xpath('//input[@name="TPL_password"]')for ch in pwd:password_element.send_keys(ch)time.sleep(0.5)btn_submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[@class="submit"]/button[@data-ing]')))btn_submit.click()# action_chains.click(btn_submit)# while True:# try:# user_name = wait.until(EC.element_to_be_clickable((By.XPATH, '//a[@class="site-nav-login-info-nick "]')))# if user_name:# user_name_info = user_name.text# print(user_name_info)# break# except TimeoutException as te:# pass# # action_chains.click(btn_submit)# slide_bar = browser.find_element_by_xpath('//span[@class="nc_iconfont btn_slide"]')# if slide_bar:# print('滑動驗證碼')## # tracks = get_track(500)# action_chains.click_and_hold(slide_bar).perform()# for x in (50, 100, 200, 400):# action_chains.move_by_offset(xoffset=x, yoffset=random.randint(1, 10)).perform()# # for i in range(10):# # x = i * 10 + random.randint(1, 50)# # action_chains.move_by_offset(xoffset=x, yoffset=random.randint(1, 10)).perform()# # time.sleep(0.2)# # action_chains.release().perform()# # action_chains.drag_and_drop_by_offset(slide_bar, 400, random.randint(1, 10)).perform()# time.sleep(random.randint(3, 5))## user_name_element = browser.find_element_by_xpath('//input[@name="TPL_username"]')# user_name_element.clear()# user_name_element.send_keys(username)## password_element = browser.find_element_by_xpath('//input[@name="TPL_password"]')# password_element.clear()# password_element.send_keys(pwd)# password_element.send_keys(Keys.ENTER)## btn_submit = wait.until(EC.element_to_be_clickable((By.XPATH, '//div[@class="submit"]/button[@data-ing]')))# btn_submit.click()# # action_chains.click(btn_submit)input('登錄淘寶后按任意鍵繼續......')user_name = wait.until(EC.element_to_be_clickable((By.XPATH, '//a[@class="site-nav-login-info-nick "]')))if user_name:user_name_info = user_name.textprint(user_name_info)# input('按任意鍵繼續......')# browser.get('https://www.taobao.com')browser.get('https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=tb.index&search_type=item&ssid=s5-e&commend=all&imgfile=&q=激光燈&suggest=0_2&_input_charset=utf-8&wq=激光&suggest_query=激光&source=suggest')# input('按任意鍵繼續......')produce_info_xpath = '//div[contains(@class, "J_MouserOnverReq")]//div[@class="row row-2 title"]/a'produce_info = browser.find_elements_by_xpath(produce_info_xpath)for produce in produce_info:print(produce.text.replace(' ', ''))if __name__ == '__main__': test_selenium()

?

?

?

?

總結

以上是生活随笔為你收集整理的python selenium 用法 和 Chrome headless的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

亚洲国产一二三 | 在线免费黄色av | 天天干,天天插 | 国产精品久久 | 天天爱天天爽 | 成人福利在线 | 特级毛片aaa | 91人人爽人人爽人人精88v | 亚洲理论片在线观看 | 色a网| 日韩一二三在线 | 成人av片免费看 | 亚洲永久免费av | 天天天干夜夜夜操 | 在线观看麻豆av | 五月天激情综合网 | 精品一区中文字幕 | 草久久久久 | 久久99精品视频 | 天天综合网在线观看 | 最新三级在线 | 在线久久 | 久久久久久草 | 国产成人精品综合久久久久99 | 97精品在线视频 | 国产精品一区二区久久精品爱微奶 | 亚洲激情在线播放 | 久久精品久久精品久久精品 | 久久99国产综合精品免费 | 亚洲色五月 | 日韩在线中文字幕视频 | 91精品久久久久久综合乱菊 | 日韩免费看片 | 国产精品久久久久久久久久久杏吧 | 播五月婷婷 | 精品国产福利在线 | 美女网站一区 | 久久精品成人欧美大片古装 | 黄色精品国产 | 91在线免费播放视频 | 天天爱天天舔 | 欧美在线日韩在线 | 色网av| 国产精品久久久av久久久 | 天天色天天操天天爽 | 国产精品免费久久久 | 九九久久影院 | 免费手机黄色网址 | 天天干天天天 | 夜夜夜夜爽 | 黄色av免费看 | 国产一区免费在线观看 | 精品久久久久久国产91 | 99热这里只有精品国产首页 | 久久1电影院 | 国产精品久久久久婷婷二区次 | 久久艹国产视频 | 亚洲国产日韩一区 | 免费看的视频 | 超薄丝袜一二三区 | 欧美福利精品 | 久久成人国产 | 97成人精品区在线播放 | 国产96精品 | 最近中文字幕免费视频 | 亚洲最新精品 | 免费观看www7722午夜电影 | 高清免费av在线 | 日韩三级免费观看 | 欧美9999| 亚洲综合激情 | 黄色小说免费观看 | 国产一区在线免费 | 中文字幕有码在线观看 | 亚洲国产精品日韩 | 在线观看日韩av | 98福利在线 | 三级免费黄 | 东方av免费在线观看 | 99婷婷| 五月婷婷综合久久 | 亚洲视频 一区 | 日韩av一区二区在线播放 | 久色小说| 色婷婷综合成人av | 免费看污污视频的网站 | 日日操夜夜操狠狠操 | 91九色在线视频 | 日本中文字幕影院 | 99久久99久久综合 | 在线观看成人国产 | 日韩在线电影一区 | 精品a在线| 亚洲欧美日本一区二区三区 | 911在线| 成人av直播 | 欧洲一区二区三区精品 | 成年美女黄网站色大片免费看 | 国产九九精品 | 中文字幕在线免费看 | 久久成人18免费网站 | 九色精品免费永久在线 | 91在线产啪 | 精品99999| 日本精品视频网站 | 日本三级中文字幕在线观看 | 中文字幕a∨在线乱码免费看 | 成人在线播放视频 | 国产黑丝袜在线 | 久久久久久国产一区二区三区 | 91私密视频 | 色综合久久中文综合久久牛 | 国产r级在线观看 | 国产做a爱一级久久 | 精品成人免费 | 亚洲一级片| 又色又爽的网站 | 毛片的网址 | www.av在线播放 | 国产一区二区三区免费观看视频 | 日本精品视频网站 | 日韩av福利在线 | 久久99这里只有精品 | 久久久免费观看完整版 | 一区二区三区精品在线 | 天天干人人| 欧美一区二区在线免费观看 | 精品99视频| 欧美一区二区视频97 | 天天操天天色天天射 | 91在线视频一区 | 日韩欧美一区二区在线观看 | 日韩欧美专区 | 色婷婷免费视频 | 午夜在线免费观看 | av电影一区 | 91色国产在线 | 91成人免费在线视频 | 免费观看v片在线观看 | 欧美日韩一区二区三区免费视频 | 午夜视频免费在线观看 | 一级片视频在线 | 国产黄色片一级 | 久久五月网 | www.一区二区三区 | 亚洲视频axxx| 国产美女视频一区 | 日韩欧美视频在线观看免费 | 欧美在线资源 | 精品国内自产拍在线观看视频 | 久久精品在线视频 | 亚洲日日日 | 在线观看一| 精品视频在线观看 | 国产 视频 久久 | 激情黄色av | 中文字幕在线国产精品 | 不卡电影一区二区三区 | 国产区精品 | 啪嗒啪嗒免费观看完整版 | 日韩欧美不卡 | 国产美女主播精品一区二区三区 | 最近更新的中文字幕 | 日韩av成人在线观看 | 日本三级香港三级人妇99 | 久久免费视频6 | 久草在线视频在线观看 | 国产一区黄色 | 97视频精品 | 久久精品亚洲精品国产欧美 | 久久精品一级片 | 成人在线观看资源 | 久草网视频在线观看 | 中文字幕一区二区三区久久 | 色在线国产 | 奇米网网址 | 国产在线观看 | 国产成人高清 | 欧美日韩一区二区视频在线观看 | 精品久久久久久国产 | 久久精品免费 | 国产精品久久久毛片 | 亚洲综合网 | 日韩女同一区二区三区在线观看 | 粉嫩aⅴ一区二区三区 | 日韩欧美在线国产 | 免费网站看av片 | 成年人视频在线观看免费 | 亚洲免费成人av电影 | 欧美一区三区四区 | 精品国产一区二区三区在线 | 国产一级h | av在线播放中文字幕 | 亚洲经典视频在线观看 | 99热在线精品观看 | 国产精品99久久久久久宅男 | 人人干人人搞 | 亚洲国产视频直播 | 欧美天堂久久 | 天天草天天 | 国产午夜av | 国产99自拍 | 亚洲欧美久久 | 日日夜夜精品网站 | 成人黄色毛片视频 | 91亚色视频在线观看 | 色视频网站在线观看一=区 a视频免费在线观看 | 88av视频| 婷婷天天色| 伊人五月婷 | 国产精品美| 97精品视频在线播放 | 国产精品99免费看 | 91福利国产在线观看 | 久久成 | 国产一区在线免费 | 国产亚洲精品v | 中文字幕视频在线播放 | 久久久午夜视频 | bbbbb女女女女女bbbbb国产 | 最新中文字幕 | 久久99久久99精品免观看粉嫩 | 狠狠干网| 婷婷伊人综合亚洲综合网 | 一区二区三区久久 | 精品在线观| 黄色官网在线观看 | 亚洲电影黄色 | 在线视频福利 | 日夜夜精品视频 | 在线观看中文字幕视频 | 亚洲国产精品资源 | 欧美a√大片 | 国产精品1024 | 午夜精品久久久99热福利 | 999久久久久久久久久久 | 一二区电影 | 中文字幕色在线视频 | 亚洲 欧美 日韩 综合 | 精品一区av | 中文字幕一区二区在线观看 | 欧美激情综合色综合啪啪五月 | 国产拍揄自揄精品视频麻豆 | 久久综合色综合88 | 日韩欧美视频免费观看 | 日韩在线不卡av | 精品欧美在线视频 | 中文av一区二区 | 在线观看黄网站 | 久久久久黄 | 国产精品欧美一区二区 | 国产一线二线三线在线观看 | 一级精品视频在线观看宜春院 | 国产在线毛片 | 在线观看免费一级片 | 日韩一级片大全 | 国产精品不卡av | 久久久久成 | 久久久精品国产免费观看同学 | 久久久久亚洲精品中文字幕 | 国产精品国产三级国产aⅴ无密码 | 国产在线视频在线观看 | 91麻豆精品国产91久久久使用方法 | 96超碰在线 | 久久精品高清视频 | 日韩精品在线免费播放 | 国产精品一区二区你懂的 | 亚洲 中文 欧美 日韩vr 在线 | 麻豆久久 | 在线观看精品国产 | 欧美日韩精品久久久 | 超碰官网 | 日韩视频一区二区三区在线播放免费观看 | 99久久精品日本一区二区免费 | 精品久久中文 | 一区二区三区在线电影 | 欧美激情第八页 | 欧美一区二区伦理片 | 色婷婷久久久 | 国产剧情在线一区 | 色黄www小说 | 亚洲欧美国产精品va在线观看 | 激情五月婷婷综合网 | 免费看精品久久片 | 国产精品69av | 视频在线国产 | 久久精品视频中文字幕 | 久久综合精品一区 | 日韩免费视频线观看 | 五月综合色 | 亚州人成在线播放 | 亚洲视频综合在线 | 精品国精品自拍自在线 | 91高清视频免费 | 在线观看中文字幕第一页 | 久久成人精品电影 | 99久久久国产免费 | 国产精品99久久久久久宅男 | 在线天堂日本 | 91精品看片 | 婷婷色av| 91一区二区三区久久久久国产乱 | 在线天堂视频 | 日韩在线视频免费看 | 麻豆视频免费观看 | 精品一区二区三区久久 | 98超碰在线 | 日韩精品免费一区二区 | 91亚洲综合 | 久久精品美女 | 国产午夜精品福利视频 | 又黄又爽又色无遮挡免费 | 欧美一级性生活视频 | 啪啪午夜免费 | 五月情婷婷 | 成人av一区二区在线观看 | 碰超人人 | 韩日三级在线 | www国产亚洲精品久久网站 | 国产福利av | 国产精品久久久网站 | 黄色成人免费电影 | 91片在线观看 | 色福利网站 | 精品自拍网 | 在线你懂的视频 | 国产精品一区二区久久精品爱涩 | 午夜精品中文字幕 | av片一区二区 | 久草电影在线观看 | 欧美性黑人 | 色综合天天做天天爱 | 一区二区视频播放 | 一区电影 | www.久久久精品| 91精品天码美女少妇 | 探花视频在线观看免费版 | 99精品视频在线看 | 干狠狠 | 亚洲国产精品免费 | 在线日韩一区 | 美女在线观看av | 波多野结衣在线播放一区 | 久久精品网站免费观看 | 国产精品久久久久久久久久新婚 | 日韩视频1| 国产亚洲情侣一区二区无 | 在线电影日韩 | 中文字幕在线日亚洲9 | 久久免费试看 | 中文字幕国语官网在线视频 | 亚洲另类视频在线观看 | 久久综合九色综合网站 | 亚洲精品日韩av | 激情伊人五月天 | 激情视频一区 | 91专区在线观看 | 888av| 99精品视频观看 | 狠狠操狠狠干天天操 | 波多野结衣在线视频一区 | 国产精品久久久久久久久久妇女 | 97精品在线视频 | 国产精品久久久久永久免费 | 黄色小说在线观看视频 | 国产成人久久精品一区二区三区 | 在线一二区| 国产精品久久久久久久久久久久久久 | 丁香综合av| 天天天天爱天天躁 | 色综合天天综合 | 欧美伦理一区 | 大荫蒂欧美视频另类xxxx | 99热这里只有精品国产首页 | 久久看毛片 | 丁香六月中文字幕 | 中文字幕av在线不卡 | 蜜臀av免费一区二区三区 | 中文字幕中文中文字幕 | 国产美女免费观看 | 久久精品三 | 最近中文字幕大全中文字幕免费 | 国产一级在线视频 | 天天曰天天干 | 色橹橹欧美在线观看视频高清 | 日本不卡一区二区 | 97久久精品午夜一区二区 | 在线小视频国产 | 黄色不卡av | 2020天天干夜夜爽 | 欧美一区二区在线免费观看 | 中文字幕一区二区三区乱码在线 | 欧美巨大 | av福利网址导航大全 | 国产日产精品一区二区三区四区的观看方式 | 在线国产视频一区 | 在线观看av黄色 | 色综合天天视频在线观看 | 国产精品久久久久久久久久了 | 日本中文字幕在线免费观看 | 久久99精品久久久久久三级 | 精品一二三四在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 一区二区三区手机在线观看 | 在线你懂 | 人人看人人做人人澡 | 成人h电影| www.com久久久 | 蜜桃av久久久亚洲精品 | 中文在线免费看视频 | 五月天.com | 韩日色视频 | 成年人国产在线观看 | 波多野结衣在线观看视频 | 亚洲五月 | 天天干,天天操,天天射 | 麻豆视频免费网站 | 色视频成人在线观看免 | 久久久久久久久久影院 | 国产99一区视频免费 | 久久免费精品一区二区三区 | 天天曰天天曰 | 91av在线免费播放 | 成人av电影免费在线播放 | 亚洲成人黄色 | 波多野结衣一区三区 | 天天亚洲综合 | 女人高潮特级毛片 | 99精品视频免费看 | 日本精品在线视频 | 成人va在线观看 | 国产日韩精品一区二区在线观看播放 | 成人av在线直播 | 在线观看中文字幕亚洲 | 日本韩国精品一区二区在线观看 | 久久极品 | 激情喷水| 中文字幕999 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 国产区在线看 | 1024手机看片国产 | 成人免费av电影 | 日b黄色片 | 欧美日韩精品久久久 | 久久免费视频这里只有精品 | 午夜手机看片 | 日韩欧美高清 | 精品久久一区二区三区 | 综合色在线| 亚州国产精品久久久 | 一区二区电影网 | 蜜桃av综合网 | 日韩在线二区 | 9999毛片| 国产精品videoxxxx | 五月天婷婷视频 | 免费网址在线播放 | 全久久久久久久久久久电影 | 丁香六月在线观看 | 中文字幕免费在线看 | 狠狠躁夜夜躁人人爽超碰91 | 九九热免费在线观看 | 天天操网 | 午夜电影中文字幕 | 99热精品免费观看 | 久久综合久久综合这里只有精品 | 国产精品视频一二三 | 久久久久成人精品免费播放动漫 | 91一区一区三区 | 国产99久久久国产精品免费看 | 天天看天天干天天操 | 日本视频高清 | 国产精品成人自产拍在线观看 | 蜜臀av性久久久久蜜臀aⅴ流畅 | 91精品国产91热久久久做人人 | 欧美日韩免费观看一区=区三区 | 久久人人爽人人片av | 九九热免费在线观看 | 日韩av福利在线 | 91精品国产99久久久久久红楼 | 丁香花在线视频观看免费 | 久久久精品国产免费观看一区二区 | 不卡中文字幕av | 青青草国产免费 | 久久精品—区二区三区 | 成人在线免费视频观看 | 国产精品中文在线 | 黄色大全免费网站 | 日韩精品大片 | 国产香蕉97碰碰碰视频在线观看 | 久久露脸国产精品 | 欧美激情视频一区二区三区 | 99视频在线免费 | av不卡中文字幕 | 亚洲片在线 | 天天操天天操天天爽 | 成人黄色av免费在线观看 | 国产欧美综合在线观看 | 少妇bbbb | 日韩另类在线 | 婷婷免费在线视频 | 色欧美视频 | 亚洲一二三久久 | 99精品视频免费看 | 免费男女羞羞的视频网站中文字幕 | 国产精品激情在线观看 | 精品一区免费 | 国产九九热 | 久久国语露脸国产精品电影 | 久久男人中文字幕资源站 | 不卡的av电影在线观看 | 久久视频免费观看 | 精品96久久久久久中文字幕无 | 成人啪啪18免费游戏链接 | 色多多污污在线观看 | 婷婷丁香国产 | 五月天亚洲综合 | 911国产在线观看 | 久久久久久久国产精品视频 | 在线观看av网站 | 91成人免费在线 | 久久精品视频3 | 中文字幕一区二区三区在线播放 | 91av资源网| 91亚洲影院| 91麻豆视频 | 欧美精品中文字幕亚洲专区 | 瑞典xxxx性hd极品| 深夜国产福利 | 国产91精品一区二区麻豆亚洲 | 国产色视频一区 | 国产夫妻性生活自拍 | 国产一区二区成人 | 五月婷婷激情综合网 | 中文字幕中文字幕 | 99在线观看免费视频精品观看 | 国产在线观看免费观看 | 天天综合网 天天 | 六月丁香综合 | 天天干天天干天天干天天干天天干天天干 | 亚洲欧美日韩一二三区 | 丁香六月国产 | 最新av观看| 99re久久精品国产 | 久久y | 日日干干 | 日日夜夜爱 | 午夜av激情| 国精产品999国精产品视频 | 日韩成人不卡 | 欧美一级爽 | 一二三久久久 | 中文亚洲欧美日韩 | 在线成人免费电影 | 黄色片视频在线观看 | 精品国产欧美一区二区三区不卡 | 黄色成人在线 | 国产精品福利在线 | 狠狠色伊人亚洲综合网站色 | 少妇搡bbb | 日韩在线免费 | 色综合小说 | 精品黄色片 | 久久午夜免费视频 | 日韩精品一卡 | 国产小视频免费观看 | 国产精品入口传媒 | 日本精品久久久久影院 | 色噜噜狠狠狠狠色综合 | 精品一区二区久久久久久久网站 | 99这里都是精品 | 粉嫩aⅴ一区二区三区 | 国产精品av久久久久久无 | 99综合影院在线 | 成人xxxx| 国产在线 一区二区三区 | 狠狠操夜夜操 | 久操中文字幕在线观看 | 成人黄色小说视频 | 在线看片视频 | 毛片区| 国产自产高清不卡 | 婷婷色九月| 国产精品久久久777 成人手机在线视频 | 亚洲精品99久久久久中文字幕 | 日韩免费中文字幕 | 国产精品日韩在线 | 另类老妇性bbwbbw高清 | 中文字幕av在线不卡 | 午夜精品久久久久久中宇69 | 久久国产视频网站 | 天天在线操 | 超碰成人网 | 久久国产一二区 | 免费观看十分钟 | 免费精品在线视频 | 欧美日韩亚洲一 | 91入口在线观看 | 日韩av一区二区三区在线观看 | 亚洲人xxx | 特级西西人体444是什么意思 | 西西4444www大胆无视频 | 69xxxx欧美| 黄色免费大片 | 国产在线精品二区 | 日韩欧美久久 | 国产一级大片免费看 | 波多野结衣精品视频 | 国产亚洲成av人片在线观看桃 | 国内精品久久天天躁人人爽 | 东方av在线免费观看 | 人人爽久久涩噜噜噜网站 | 玖操| 狠狠干天天 | 亚洲精品视频网址 | 美女网站视频免费都是黄 | 午夜10000| 在线观看亚洲精品 | 99视频精品全国免费 | 日本 在线 视频 中文 有码 | 超碰99人人 | 久草在线一免费新视频 | 国产精品一区二区av | 国产精品综合在线观看 | 日韩欧美网址 | 一区二区亚洲精品 | 91麻豆免费视频 | 国产伦精品一区二区三区… | 日日夜夜操av | 在线www色| 国内精品久久久久久久久久久久 | 免费看黄网站在线 | 精品专区一区二区 | 中文字幕在线观看网 | 亚州精品一二三区 | 成人黄色免费在线观看 | 亚洲最大av网站 | 日本韩国精品在线 | 69av久久| 91久久久久久久一区二区 | 日韩一级电影在线 | 黄色一级网 | 欧美精品xx | 国产精品久久久久久久久久久久午夜片 | 国产日本三级 | 日日干美女 | 国产69久久 | 国产成人精品一区二区三区在线观看 | av日韩av| av免费在线看网站 | 五月天婷婷在线播放 | 亚洲专区 国产精品 | 青青啪 | 日韩在线免费不卡 | 久久久久久久久久免费 | 国产91精品在线观看 | 久久久国产精华液 | 久久免费成人 | 高清有码中文字幕 | 国产高清精品在线观看 | 国产人成精品一区二区三 | 亚洲春色成人 | 国产精品自在线 | 麻豆一精品传二传媒短视频 | 久久久久久久久久久久影院 | 最近最新中文字幕视频 | 香蕉视频在线网站 | 亚洲天堂在线观看完整版 | 国产精品欧美在线 | 久久视频一区 | 黄色亚洲精品 | 亚洲精品国产精品国自产在线 | 一区二区三区视频网站 | 国产日产精品一区二区三区四区的观看方式 | 国产精品免费成人 | 92国产精品久久久久首页 | 免费成人av | 亚洲欧美成人 | 日日操夜 | 国产婷婷久久 | 国产a视频免费观看 | 少妇bbb搡bbbb搡bbbb′ | 国产精品每日更新 | 久久久久久国产一区二区三区 | 丁香六月在线 | 69视频在线播放 | 波多野结依在线观看 | 免费看成人| 日本高清xxxx | 黄网站免费久久 | 99热9| 国产色在线,com | 日本中文字幕在线 | 久久久av免费 | 成人在线一区二区三区 | 亚洲一区不卡视频 | 五月婷婷一区二区三区 | 欧美日韩久久一区 | 99色亚洲 | 成人影视免费看 | 中文字幕免费国产精品 | 91麻豆精品国产91久久久久久久久 | 久久国产一区二区三区 | 91在线观看高清 | 色婷婷国产精品一区在线观看 | 国产资源精品 | 国产vs久久| 亚洲精品国产成人 | 久久蜜臀av| 久久草在线免费 | 在线免费91 | 国内精自线一二区永久 | 亚洲精品美女在线观看播放 | 最新中文字幕在线播放 | 国产黄在线看 | 白丝av在线 | 国产91九色蝌蚪 | 在线视频亚洲 | 亚洲黄色一级大片 | 91视频 - 114av| 亚洲第一久久久 | 日本午夜在线观看 | 亚洲91精品| av网站在线观看播放 | 精品欧美一区二区在线观看 | 成人在线视频免费观看 | 91传媒91久久久 | 天天操天天色天天射 | 天天夜夜操 | 91亚洲网| 久久黄色免费视频 | 久久免费观看少妇a级毛片 久久久久成人免费 | 亚洲欧美日韩一级 | 日韩二三区 | 一区二区三区高清在线 | 一区二区精品 | 九九影视理伦片 | 17婷婷久久www | 日韩三级免费观看 | 亚洲精品视频免费观看 | 成人全视频免费观看在线看 | 香蕉影院在线播放 | www黄免费 | 香蕉精品视频在线观看 | 色在线免费观看 | 日韩久久精品 | 色美女在线 | 右手影院亚洲欧美 | 国产高清视频在线播放一区 | 午夜视频久久久 | 在线免费av网 | 亚洲片在线资源 | 888av| 在线观看av片 | 欧美a级在线播放 | 色资源网免费观看视频 | caobi视频 | 99精品免费网 | 韩国av永久免费 | 欧美久久久久 | 亚洲最大激情中文字幕 | 国产精品成人aaaaa网站 | 色成人亚洲 | 中文字幕国产一区 | 天天综合网国产 | 国内精品视频免费 | 91精品国 | 久久久亚洲麻豆日韩精品一区三区 | 四虎影视成人 | 日韩免费专区 | 成人午夜网 | 99精品欧美一区二区蜜桃免费 | av资源免费在线观看 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 欧美日韩在线精品一区二区 | 国产无吗一区二区三区在线欢 | 99在线免费视频观看 | 一区二区三区日韩视频在线观看 | 国外av在线| 99久久www | 久久精品久久精品久久39 | 五月婷婷视频在线 | 日韩激情三级 | 99爱这里只有精品 | 色婷婷a| 青草视频在线免费 | 午夜视频在线观看一区二区三区 | 久久人人爽人人爽人人片av软件 | 久久久久免费精品视频 | 超碰免费成人 | 最近日本字幕mv免费观看在线 | 久久综合九色综合久久久精品综合 | 成人av在线网 | www.午夜视频 | 久久96国产精品久久99漫画 | 国产一区二区三区久久久 | 日韩美在线 | 日本最新一区二区三区 | 亚洲一级国产 | 天天做日日做天天爽视频免费 | 久久视频精品在线观看 | 99中文视频在线 | 香蕉网在线播放 | 丰满少妇在线观看网站 | 日韩a级免费视频 | 毛片播放网站 | 超碰人人草 | 五月亚洲| 色射色 | 亚洲 欧美日韩 国产 中文 | 国产亚洲午夜高清国产拍精品 | 欧美一进一出抽搐大尺度视频 | 91精品欧美一区二区三区 | 天天草视频 | 免费成人结看片 | 中文字幕在线网址 | 欧美a在线免费观看 | 久久精品—区二区三区 | 午夜婷婷综合 | 中文字幕乱码在线播放 | 又色又爽又黄高潮的免费视频 | 操操操综合 | 成年人国产视频 | 中文字幕国产一区二区 | 国产欧美精品一区二区三区 | 91传媒免费观看 | 国产中文在线观看 | 日韩系列在线观看 | 一级片黄色片网站 | 特级西西444www大胆高清无视频 | 成人久久综合 | 91麻豆国产 | 国产精品99视频 | 婷婷丁香在线观看 | 国产精品麻豆99久久久久久 | 欧美日韩国产页 | 免费观看一级 | 91人网站| 欧美日本国产在线观看 | 欧美日韩不卡在线 | 久草免费电影 | 国产亚洲精品久久久网站好莱 | 国产亚洲91 | 精品一区二区综合 | 黄色av影院 | a特级毛片 | 99久久综合国产精品二区 | 奇米导航 | 亚洲在线视频播放 | 久久五月婷婷综合 | 国产亚洲永久域名 | 国内毛片毛片 | 日本中文字幕视频 | 在线天堂v | 狠狠地操| av在线成人| 成人午夜精品 | 婷婷丁香花五月天 | 在线国产日韩 | 黄色av成人在线观看 | 国产精品美女久久久久aⅴ 干干夜夜 | 五月天久久久 | 国产黄色免费电影 | 99久久精品久久亚洲精品 | 91天堂素人约啪 | 91丝袜美腿 | 久久99久久99精品中文字幕 | 中文字幕一区二区三区乱码不卡 | 国产一区二区电影在线观看 | 国产视频色| 国产亚洲精品免费 | 顶级bbw搡bbbb搡bbbb | 操一草| 91成人在线观看高潮 | 精品视频免费观看 | 不卡的av片 | 久久久久久久久久电影 | 国产一区二区在线免费视频 | 中文字幕在线一二 | 黄色av网站在线免费观看 | 最新中文在线视频 | 精品国产一区二区三区在线 | 亚洲欧美国产日韩在线观看 | 在线观看完整版 | 青青河边草免费观看完整版高清 | 欧美精品国产精品 | 一级性av | 国产伦精品一区二区三区照片91 | 丁香婷婷电影 | 亚洲精品久久视频 | 青春草免费在线视频 | 日本不卡一区二区三区在线观看 | 手机av电影在线观看 | 国产视频1| 免费看国产a | 国产精品久久久久婷婷 | 超级碰碰免费视频 | 亚洲精品欧洲精品 | 欧美成人手机版 | 日韩免费在线视频 | 最新中文字幕视频 | 国产91学生粉嫩喷水 | 天天爽天天爽天天爽 | 久久久综合电影 | 一级免费看 | 91女子私密保健养生少妇 | 97超级碰 | 黄视频色网站 | 久青草电影 | 国产亚洲一级高清 | 久久美女高清视频 | 四月婷婷在线观看 | 97天堂网 | 精品久久一区二区 | 国产一级二级在线播放 | 成人av免费播放 | 一性一交视频 | 免费观看www小视频的软件 | 亚洲狠狠婷婷 | 在线观看国产日韩欧美 | av三区在线| 国产破处在线播放 | 狠狠躁18三区二区一区ai明星 | 高清不卡一区二区三区 | 二区视频在线观看 | 国产亚洲精品久久久久久移动网络 | 在线观看中文字幕 | 国产精品欧美一区二区三区不卡 | 欧美日本国产在线观看 | 狠狠狠的干 | 中文字幕资源网 国产 | 99久久99久久| 又黄又爽的视频在线观看网站 | 天天天在线综合网 | 综合亚洲视频 | 国产免费观看久久 | 少妇性xxx| 西西www444 | 91久久偷偷做嫩草影院 | av.com在线 | 天天色天天色天天色 | 久久五月天色综合 | 国内精品久久久久影院男同志 | 国产亚洲精品免费 | 日韩av成人在线观看 | 久草视频在线新免费 | 色99在线| 在线观看久 | 免费人人干 | 日韩欧在线| 五月婷香蕉久色在线看 | 99国产精品久久久久老师 | 国产在线精品一区 | 婷婷久久久 | 久久国产高清视频 | 综合av在线 | 日韩免费福利 | 久草久草在线 | 97国产精品一区二区 | 久久久久高清毛片一级 | 久久第四色| 国产日韩欧美在线看 | 天天综合网久久综合网 | 中文在线字幕免费观看 | 久草视频在线新免费 | 欧美成人h版 | 中文字幕一二三区 | 国产精品video爽爽爽爽 | 日韩精品中文字幕有码 | 亚洲国产精品成人精品 | 亚洲乱码在线观看 | 黄色www | 欧美日韩中文在线观看 | 五月婷av| 国产96在线 | 国产日韩欧美综合在线 | 日韩狠狠操 | aⅴ视频在线| 亚洲 欧美 精品 | 日日爱av | 美女福利视频 | 国产精品久久久久久久久久东京 | 亚洲精品男女 | 日韩精品第一区 | 精品久久福利 | 成人a级大片 | 女人高潮一级片 | 日韩精品一区二区三区在线播放 | 美女在线观看网站 | 国产丝袜网站 | 丁香婷婷综合激情 | 精品久久网 | 欧美日韩性生活 | 国产精品资源在线 | 久久国产精品久久久 | 不卡视频国产 | 干狠狠| 日韩欧美区 |