溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

python自動(dòng)化測(cè)試中Selenium怎么用

發(fā)布時(shí)間:2022-03-14 09:15:54 來(lái)源:億速云 閱讀:248 作者:小新 欄目:開(kāi)發(fā)技術(shù)

小編給大家分享一下python自動(dòng)化測(cè)試中Selenium怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    1.安裝

    完成自動(dòng)化測(cè)試,需要配置三個(gè)東西。

    python自動(dòng)化測(cè)試中Selenium怎么用

    selenium:pip就可以了

    chrome:瀏覽器下載一個(gè)谷歌瀏覽器就行

    chrome-driver:下載地址http://chromedriver.storage.googleapis.com/index.html

    從瀏覽器上下載到本地后,本機(jī)mac上自動(dòng)保存至Download/目錄下

    但我們要把它轉(zhuǎn)移到該去的地方

    具體終端命令如下:

    #目錄到下載位置
    cd Downloads/
    #解壓zip文件
    unzip chromedriver_mac64.zip 
    #拿到解壓后文件Unix Executable類(lèi)型文件后,移動(dòng)它該去的位置
    mv chromedriver /usr/local/bin/

    2.基礎(chǔ)操作

    下面就來(lái)了解一下 Selenium 的一些基礎(chǔ)操作把。先寫(xiě)一點(diǎn)簡(jiǎn)單的小功能演示一下:

    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)

    運(yùn)行以上代碼,可以看到自動(dòng)彈出來(lái)一個(gè) Chrome 瀏覽器,并且上面標(biāo)示了: Chrome 正受到自動(dòng)軟件的控制 。然后打開(kāi)了百度,在輸入框中輸入了 “楊冪” 進(jìn)行搜索

    python自動(dòng)化測(cè)試中Selenium怎么用

    2.1 聲明瀏覽器對(duì)象

    Selenium 支持非常多的瀏覽器,如:

    from selenium import webdriver
    # 聲明瀏覽器對(duì)象,需對(duì)應(yīng)的驅(qū)動(dòng)程序方可使用
    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 瀏覽器等等。

    2.2 訪(fǎng)問(wèn)網(wǎng)頁(yè)

    訪(fǎng)問(wèn)網(wǎng)頁(yè)可以使用 get() 方法,參數(shù)傳入我們想要訪(fǎng)問(wèn)的網(wǎng)站即可:

    from selenium import webdriver
    browser = webdriver.Chrome()
    browser.get('https://www.jd.com/')
    print(browser.page_source)

    通過(guò)上面兩行代碼,我們可以看到自動(dòng)打開(kāi)了瀏覽器并訪(fǎng)問(wèn)的京東,在控制臺(tái)打印了京東的源代碼。

    當(dāng)然,如果想要程序自動(dòng)關(guān)閉瀏覽器的話(huà)可以使用:

    browser.close()

    2.3 查找單個(gè)節(jié)點(diǎn)

    我們獲取到網(wǎng)頁(yè)后,第一步肯定是要先查找到 DOM 節(jié)點(diǎn)啊,然后可以直接從 DOM 節(jié)點(diǎn)中獲取數(shù)據(jù)。

    不過(guò)有了 Selenium 以后,我們不僅可以查找到節(jié)點(diǎn)獲取數(shù)據(jù),還可以模擬用戶(hù)操作,比如在搜索框輸入某些內(nèi)容,點(diǎn)擊按鈕等等操作,不過(guò)還是先看看怎么查找節(jié)點(diǎn):

    python自動(dòng)化測(cè)試中Selenium怎么用

    從上面這張圖可以看到,我們想要獲取輸入框,可以通過(guò) id 進(jìn)行獲取,那么我們接下來(lái)的代碼要這么寫(xiě):

    from selenium import webdriver
    browser = webdriver.Chrome()
    browser.get('https://www.jd.com/')
    input_key = browser.find_element_by_id('key')
    print(input_key)

    結(jié)果如下:

    <selenium.webdriver.remote.webelement.WebElement (session="86d1ae1419bee22099a168dfbf921a27", element="53047804-ad39-4dfd-b3fb-a149fb1c8ac8")>

    可以看到,我們獲得的元素類(lèi)型是 WebElement 。

    這里順手列出所有的獲得單個(gè)節(jié)點(diǎn)的方法:

    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 還未我們提供了一個(gè)通用方法 find_element() ,它需要傳入兩個(gè)參數(shù):查找方式 By 和值。實(shí)際上上面示例中的查找方式還可以這么寫(xiě)(效果完全一樣哦~~~)

    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)

    2.4 查找多個(gè)節(jié)點(diǎn)

    比如我們要查找左邊的這種導(dǎo)航條的所有條目:

    python自動(dòng)化測(cè)試中Selenium怎么用

    可以這么寫(xiě)

    lis = browser.find_elements_by_css_selector('.cate_menu li')
    print(lis)

    結(jié)果如下:

    [<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")>, 
    ......]

    下面列出來(lái)所有的多節(jié)點(diǎn)選擇的方法:

    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

    同樣,多節(jié)點(diǎn)選擇也有一個(gè) find_elements() 的方法,

    3.等待

    如今,大多數(shù) Web 應(yīng)用程序都在使用 AJAX 技術(shù)。當(dāng)瀏覽器加載頁(yè)面時(shí),該頁(yè)面中的元素可能會(huì)以不同的時(shí)間間隔加載。這使定位元素變得困難:如果 DOM 中尚不存在元素,則定位函數(shù)將引發(fā) ElementNotVisibleException 異常。使用等待,我們可以解決此問(wèn)題。等待在執(zhí)行的動(dòng)作之間提供了一定的松弛時(shí)間-主要是定位元素或?qū)υ撛剡M(jìn)行的任何其他操作。

    Selenium Webdriver 提供兩種類(lèi)型的等待-隱式和顯式。顯式等待使 WebDriver 等待特定條件發(fā)生,然后再繼續(xù)執(zhí)行。隱式等待使 WebDriver 在嘗試查找元素時(shí)輪詢(xún)DOM一定時(shí)間。

    3.1 顯式等待

    我們可以使用 time.sleep() 來(lái)設(shè)定等待時(shí)間,完全沒(méi)有問(wèn)題,但是它需要將條件設(shè)置為要等待的確切時(shí)間段。如果我們不知道準(zhǔn)確的渲染時(shí)間,我們就無(wú)法設(shè)定一個(gè)比較合適的值。

    Selenium 為我們提供了 WebDriverWait 與 ExpectedCondition 來(lái)完成這件事情,看代碼:

    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()

    結(jié)果如下:

    <selenium.webdriver.remote.webelement.WebElement (session="b1baacca997d18d7d54447127c844d15", element="a472369e-3196-4456-b43e-4e1b280bf5b9")>

    上面我們使用了 WebDriverWait 來(lái)設(shè)置最長(zhǎng)等待時(shí)間,這里我們選擇獲取 JD 首頁(yè)的輸入框,我們限定的等待時(shí)間為 10s ,如果它在 10s 內(nèi)都無(wú)法返回結(jié)果,將會(huì)拋出 TimeoutException 。默認(rèn)情況下, WebDriverWait 每 500 毫秒調(diào)用 ExpectedCondition ,直到成功返回。

    3.2 隱式等待

    隱式等待告訴 WebDriver 在嘗試查找不立即可用的一個(gè)或多個(gè)元素時(shí)在一定時(shí)間內(nèi)輪詢(xún) DOM 。默認(rèn)設(shè)置為 0 。設(shè)置后,將在 WebDriver 對(duì)象的生存期內(nèi)設(shè)置隱式等待。

    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)

    節(jié)點(diǎn)交互

    Selenium 為我們提供了一些節(jié)點(diǎn)的交互動(dòng)作,如輸入文字時(shí)可以用 send_keys() 方法,清空文字時(shí)可以用 clear() 方法,點(diǎn)擊按鈕時(shí)可以用 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()

    在上面這個(gè)示例中,我們先打開(kāi)淘寶網(wǎng),并且開(kāi)啟了隱式等待,先在搜索框中輸入了 IPad ,在等待 1s 后刪除,再輸入了 Surface Pro ,然后點(diǎn)擊了搜索按鈕,先在淘寶搜索需要用戶(hù)登錄才能搜索,所以我們直接跳轉(zhuǎn)到了登錄頁(yè)。

    執(zhí)行 JavaScript

    對(duì)于某些 Selenium API 沒(méi)有提供的操作,我們可以通過(guò)模擬運(yùn)行 JavaScript 的方式來(lái)完成,用到的方法是 execute_script() ,比如我們?cè)谔詫毷醉?yè)將滾動(dòng)條滑到底部:

    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('https://www.taobao.com/')
    driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')

    獲取信息

    前面我們介紹了如何拿到 DOM 節(jié)點(diǎn),那么最重要的是我們要從 DOM 節(jié)點(diǎn)上來(lái)獲取我們需要的信息。

    因?yàn)槲覀儷@取的是 WebElement 類(lèi)型,而 WebElement 也提供了相關(guān)的方法來(lái)提取節(jié)點(diǎn)信息。

    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    # 實(shí)例化一個(gè)啟動(dòng)參數(shù)對(duì)象
    chrome_options = Options()
    # 設(shè)置瀏覽器窗口大小
    chrome_options.add_argument('--window-size=1366, 768')
    # 啟動(dòng)瀏覽器
    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)

    上面因?yàn)?Chrome 默認(rèn)打開(kāi)大小有點(diǎn)小,打開(kāi)小編博客的時(shí)候小編選擇的這個(gè) DOM 節(jié)點(diǎn)正好看到,所以小編設(shè)置了一下 Chrome 瀏覽器打開(kāi)時(shí)的大小。

    具體信息的供大家參考:

    • parent:查找到此元素的WebDriver實(shí)例的內(nèi)部引用。

    • rect:具有元素大小和位置的字典。

    • screenshot_as_base64:以 base64 編碼字符串的形式獲取當(dāng)前元素的屏幕快照。

    • screenshot_as_png:以二進(jìn)制數(shù)據(jù)獲取當(dāng)前元素的屏幕截圖。最后這兩個(gè)獲取元素屏幕快照,在獲取驗(yàn)證碼的時(shí)候?qū)Ⅱ?yàn)證碼截取出來(lái)會(huì)很好用的。

    前進(jìn)和后退

    我們使用瀏覽器最上面的地方有一個(gè)前進(jìn)和后退按鈕,Selenium 完成這兩個(gè)動(dòng)作使用了 back() 和 forward() 這兩個(gè)方法。

    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

    又到了一個(gè)重點(diǎn)內(nèi)容, Cookies ,它是和服務(wù)端保持會(huì)話(huà)的一個(gè)重要元素。 Selenium 為我們提供了一些方法,讓我們可以方便的對(duì) Cookies 進(jìn)行增刪改查等操作。示例如下:

    from selenium import webdriver
    browser = webdriver.Chrome()
    browser.get('https://www.geekdigging.com/')
    # 獲取 cookies
    print(browser.get_cookies())
    # 添加一個(gè) 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())

    以上是“python自動(dòng)化測(cè)試中Selenium怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI