<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
完成自動化測試,需要設定三個東西。
selenium
:pip就可以了
chrome
:瀏覽器下載一個谷歌瀏覽器就行
chrome-driver
:下載地址http://chromedriver.storage.googleapis.com/index.html
這裡需要對應到自己的瀏覽器版本下載。可以參考這篇
https://www.jb51.net/article/240643.htm
從瀏覽器上下載到本地後,本機mac上自動儲存至Download/目錄下
但我們要把它轉移到該去的地方
具體終端命令如下:
#目錄到下載位置 cd Downloads/ #解壓zip檔案 unzip chromedriver_mac64.zip #拿到解壓後檔案Unix Executable型別檔案後,移動它該去的位置 mv chromedriver /usr/local/bin/
下面就來了解一下 Selenium 的一些基礎操作把。先寫一點簡單的小功能演示一下:
from selenium import webdriver from selenium.webdriver.common.keys import Keys browser = webdriver.Chrome() browser.get('https://www.baidu.com') input = browser.find_element_by_id('kw') input.send_keys('楊冪') input.send_keys(Keys.ENTER) print(browser.current_url) print(browser.get_cookies()) print(browser.page_source)
執行以上程式碼,可以看到自動彈出來一個 Chrome 瀏覽器,並且上面標示了: Chrome 正受到自動軟體的控制 。然後開啟了百度,在輸入框中輸入了 “楊冪” 進行搜尋
Selenium 支援非常多的瀏覽器,如:
from selenium import webdriver # 宣告瀏覽器物件,需對應的驅動程式方可使用 browser = webdriver.android() browser = webdriver.blackberry() browser = webdriver.chrome() browser = webdriver.edge() browser = webdriver.firefox() browser = webdriver.ie() browser = webdriver.opera() browser = webdriver.phantomjs() browser = webdriver.safari()
可以看到有我熟悉的 IE 瀏覽器、 Edge 瀏覽器、 FireFox 瀏覽器、 Opera 瀏覽器等等。
存取網頁可以使用 get() 方法,引數傳入我們想要存取的網站即可:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.jd.com/') print(browser.page_source)
通過上面兩行程式碼,我們可以看到自動開啟了瀏覽器並存取的京東,在控制檯列印了京東的原始碼。
當然,如果想要程式自動關閉瀏覽器的話可以使用:
browser.close()
我們獲取到網頁後,第一步肯定是要先查詢到 DOM 節點啊,然後可以直接從 DOM 節點中獲取資料。
不過有了 Selenium 以後,我們不僅可以查詢到節點獲取資料,還可以模擬使用者操作,比如在搜尋方塊輸入某些內容,點選按鈕等等操作,不過還是先看看怎麼查詢節點:
從上面這張圖可以看到,我們想要獲取輸入框,可以通過 id 進行獲取,那麼我們接下來的程式碼要這麼寫:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.jd.com/') input_key = browser.find_element_by_id('key') print(input_key)
結果如下:
<selenium.webdriver.remote.webelement.WebElement (session="86d1ae1419bee22099a168dfbf921a27", element="53047804-ad39-4dfd-b3fb-a149fb1c8ac8")>
可以看到,我們獲得的元素型別是 WebElement 。
這裡順手列出所有的獲得單個節點的方法:
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
此外, selenium 還未我們提供了一個通用方法 find_element() ,它需要傳入兩個引數:查詢方式 By 和值。實際上上面範例中的查詢方式還可以這麼寫(效果完全一樣哦~~~)
from selenium import webdriver from selenium.webdriver.common.by import By browser = webdriver.Chrome() browser.get('https://www.jd.com/') input_key1 = browser.find_element(By.ID, 'key') print(input_key1)
比如我們要查詢左邊的這種導覽列的所有條目:
可以這麼寫
lis = browser.find_elements_by_css_selector('.cate_menu li') print(lis)
結果如下:
[<selenium.webdriver.remote.webelement.WebElement (session="6341ab4f39733b5f6b6bd51508b62f1d", element="8e0d1a8c-d5dc-4b1f-8250-7f0eca864ea7")>, <selenium.webdriver.remote.webelement.WebElement (session="6341ab4f39733b5f6b6bd51508b62f1d", element="15cd4dc9-42f4-4ed7-9258-9aa29073243c")>,
......]
下面列出來所有的多節點選擇的方法:
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
同樣,多節點選擇也有一個 find_elements() 的方法,
如今,大多數 Web 應用程式都在使用 AJAX 技術。當瀏覽器載入頁面時,該頁面中的元素可能會以不同的時間間隔載入。這使定位元素變得困難:如果 DOM 中尚不存在元素,則定位函數將引發 ElementNotVisibleException 異常。使用等待,我們可以解決此問題。等待在執行的動作之間提供了一定的鬆弛時間-主要是定位元素或對該元素進行的任何其他操作。
Selenium Webdriver 提供兩種型別的等待-隱式和顯式。顯式等待使 WebDriver 等待特定條件發生,然後再繼續執行。隱式等待使 WebDriver 在嘗試查詢元素時輪詢DOM一定時間。
我們可以使用 time.sleep() 來設定等待時間,完全沒有問題,但是它需要將條件設定為要等待的確切時間段。如果我們不知道準確的渲染時間,我們就無法設定一個比較合適的值。
Selenium 為我們提供了 WebDriverWait 與 ExpectedCondition 來完成這件事情,看程式碼:
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 EC driver = webdriver.Chrome() driver.get("https://www.jd.com/") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "key")) ) finally: driver.quit()
結果如下:
<selenium.webdriver.remote.webelement.WebElement (session="b1baacca997d18d7d54447127c844d15", element="a472369e-3196-4456-b43e-4e1b280bf5b9")>
上面我們使用了 WebDriverWait 來設定最長等待時間,這裡我們選擇獲取 JD 首頁的輸入框,我們限定的等待時間為 10s ,如果它在 10s 內都無法返回結果,將會丟擲 TimeoutException 。預設情況下, WebDriverWait 每 500 毫秒呼叫 ExpectedCondition ,直到成功返回。
隱式等待告訴 WebDriver 在嘗試查詢不立即可用的一個或多個元素時在一定時間內輪詢 DOM 。預設設定為 0 。設定後,將在 WebDriver 物件的生存期內設定隱式等待。
from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # seconds driver.get("https://www.jd.com/") key = driver.find_element_by_id("key") print(key)
節點互動
Selenium 為我們提供了一些節點的互動動作,如輸入文字時可以用 send_keys() 方法,清空文字時可以用 clear() 方法,點選按鈕時可以用 click() 方法。
from selenium import webdriver import time driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get('https://www.taobao.com/') input = driver.find_element_by_id('q') input.send_keys('IPad') time.sleep(1) input.clear() input.send_keys('Surface Pro') button = driver.find_element_by_class_name('btn-search') button.click()
在上面這個範例中,我們先開啟淘寶網,並且開啟了隱式等待,先在搜尋方塊中輸入了 IPad ,在等待 1s 後刪除,再輸入了 Surface Pro ,然後點選了搜尋按鈕,先在淘寶搜尋需要使用者登入才能搜尋,所以我們直接跳轉到了登入頁。
執行 JavaScript
對於某些 Selenium API 沒有提供的操作,我們可以通過模擬執行 JavaScript 的方式來完成,用到的方法是 execute_script() ,比如我們在淘寶首頁將卷軸滑到底部:
from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.taobao.com/') driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
獲取資訊
前面我們介紹瞭如何拿到 DOM 節點,那麼最重要的是我們要從 DOM 節點上來獲取我們需要的資訊。
因為我們獲取的是 WebElement 型別,而 WebElement 也提供了相關的方法來提取節點資訊。
from selenium import webdriver from selenium.webdriver.chrome.options import Options # 範例化一個啟動引數物件 chrome_options = Options() # 設定瀏覽器視窗大小 chrome_options.add_argument('--window-size=1366, 768') # 啟動瀏覽器 driver = webdriver.Chrome(chrome_options=chrome_options) url = 'https://www.geekdigging.com/' driver.get(url) title = driver.find_element_by_xpath('//*[@id="text-4"]/div/div/div[1]/div[2]/a') print(title) # 獲取屬性資訊 print(title.get_attribute('href')) # 獲取文字資訊 print(title.text) # 獲取位置 print(title.location) # 獲取大小 print(title.size)
上面因為 Chrome 預設開啟大小有點小,開啟小編部落格的時候小編選擇的這個 DOM 節點正好看到,所以小編設定了一下 Chrome 瀏覽器開啟時的大小。
具體資訊的供大家參考:
前進和後退
我們使用瀏覽器最上面的地方有一個前進和後退按鈕,Selenium 完成這兩個動作使用了 back() 和 forward() 這兩個方法。
import time from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.jd.com/') browser.get('https://www.taobao.com/') browser.get('https://www.geekdigging.com/') browser.back() time.sleep(1) browser.forward()
Cookies
又到了一個重點內容, Cookies ,它是和伺服器端保持對談的一個重要元素。 Selenium 為我們提供了一些方法,讓我們可以方便的對 Cookies 進行增刪改查等操作。範例如下:
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://www.geekdigging.com/') # 獲取 cookies print(browser.get_cookies()) # 新增一個 cookie browser.add_cookie({'name': 'name', 'domain': 'www.geekdigging.com', 'value': 'geekdigging'}) print(browser.get_cookies()) # 刪除所有 cookie browser.delete_all_cookies() print(browser.get_cookies())
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45