天天看點

Python——按鍵操作、時間等待、點選

一、按鍵操作

       selenium提供了比較完整的按鍵操作,在使用按鍵操作之前引入包from selenium.webdriver.commen.keys import Keys,然後就可以模拟按鍵操作。以進入百度網頁為例,進行具體的按鍵操作。

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
time.sleep(3)
# 找到輸入框并輸入指定内容
driver.find_element_by_id('kw').send_keys('selenium')
# ctr + a 全選輸入框内的全部内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'a')
time.sleep(3)
# ctr + x 剪切輸入框内的内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')
time.sleep(2)
# 搜尋爬蟲技巧
driver.find_element_by_id('kw').send_keys(u'爬蟲技巧')
time.sleep(2)
# 點選搜尋按鈕
driver.find_element_by_id('su').click()
time.sleep(6)
# 退出浏覽器
driver.quit()           

複制

二、時間等待

       selenium由網頁驅動驅使浏覽器進行操作,速度慢是一大特點,經常會出現代碼執行完了,但是網頁還沒有加載完畢;如果這個時候操作裡面的标簽報出異常NoSuchElementException,解決的辦法是時間休眠time.sleep()。

       引入一個網頁等待的包from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
# 在搜尋框内輸入helloworld
# driver.find_element_by_id('kw').send_keys('hello wolrd')
button = driver.find_element_by_id('su')
# WebDriverWait 網頁等待 值1:等待的對象  值2:等待的時間
# WebDriverWait 經常和until not 一起使用 until直到
# lambda 匿名函數  is_displayed是否已經顯示
is_visible = WebDriverWait(driver,10).until(lambda driver : button.is_displayed())
print(is_visible)
button.click()           

複制

     WebDriverWait()和time.sleep()的差別:(1)都是讓程式等待指定執行的時間(2)time的時間是固定的,時間長短不會随着标簽的加載速度而改變;WebDriverWait時間是固定的,等待多少時間要看标簽的加載時間和指定的固定時間(3)如果在指定時間内,标簽仍然沒有加載出來,那麼time和WebDriverWait都會報出異常。

三、點選事件

     首先引入包from selenium.webdriver.common.action_chains import ActionChains

     以點選百度logo為例:

from selenium import webdriver
# action行動 chains鍊
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
import time
driver = webdriver.Firefox()
driver.get('http://www.baidu.com')
# 找到百度logo的三種方法
# logo = driver.find_element_by_class_name('index-logo-src')

logo = driver.find_element_by_xpath('//div[@id="lg"]/img')

# logo = driver.find_element_by_css_selector('#Id > img')

# 等待直到标簽出現
WebDriverWait(driver,10).until(lambda driver : logo.is_displayed())
# 單擊事件
# ActionChains(driver).click(logo).perform()
# 輕按兩下事件
ActionChains(driver).double_click(logo).perform()
# context 上下文  context_click 
# 右擊事件
action = ActionChains(driver).context_click(logo)

# 操作時間會跑到perform隊列裡面 perform實作
action.perform()
#time.sleep(5)           

複制

# 滑鼠移動
more = driver.find_element_by_class_name('bri')
WebDriverWait(driver,10).until(lambda driver : more.is_displayed())
ActionChains(driver).move_to_element(more).perform()           

複制

四、标簽選擇

       引入一個包from selenium.webdriver.common.by import By

       建一個html檔案

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <button id="red" class="red" οnclick="fun1()">按鈕1</button>
    <button type="button" name="username" οnclick="fun2()">按鈕2</button>
    <button type="button" οnclick="fun3()">按鈕3</button>
    <button id="pink" οnclick="fun4()">按鈕4</button>
    <script>
        function fun1() {
            document.body.style.backgroundColor = 'red'
        }
        function fun2() {
            document.body.style.backgroundColor = 'green'
        }
        function fun3() {
            document.body.style.backgroundColor = 'blue'
        }
        function fun4() {
            document.body.style.backgroundColor = 'pink'
        }
    </script>
</body>
</html>           

複制

       通過這些标簽進行相關操作

from selenium import webdriver
from selenium.webdriver.common.by import By
import os
import time
driver = webdriver.Firefox()
driver.get('file:///' + os.path.abspath('4.index.html'))
# 通過标簽名字來找到指定的标簽
btns = driver.find_elements_by_tag_name('button')
print(btns)           

複制

       找到任意标簽的四種方式

# 1.通過索引來找到指定的标簽
btns[1].click()
for btn in btns :
    #2.通過屬性來找到指定的标簽
    # 根據按鈕屬性點選 首先是一個button,然後name屬性是username
    if btn.get_attribute('name') == 'username':
        btn.click()
    time.sleep(3)
    btn.click()

# 找到的是第一個按鈕
driver.find_element_by_tag_name('button').click()
# find_element_by_XX通過XX來找到所有标簽當中的第一個标簽
# find_elements_by_XX通過XX來找到所有符合的标簽

# 3.彈出指定元素 如果不寫索引 預設為最後一個
driver.find_elements_by_css_selector('button').pop(2).click()

# [type=button] []裡面為限制條件 限制選擇的内容
driver.find_elements_by_css_selector('button[type="button"]').pop().click()
# 4.通過...來找到指定的标簽 by=By.XX
driver.find_element(by=By.ID,value='pink').click()           

複制