Selenium - Selenium webdriver的基本操作


selenium ide 的安裝

? 關於

selenium ide用來錄制和回放的selenium工具.谷歌和火狐都支持該插件的下載.

下載

  1. 去谷歌或者火狐的應用商店搜索selenium ide

  2. 點擊`添加到Firefox`

  3. 成功 ,瀏覽器的右上角顯示即可.

另外,谷歌由於谷歌商店一般被牆,我們去https://www.extfans.com/網站搜索下載.下載本地是一個壓縮包,解壓.

點擊谷歌瀏覽器的設置--> 更多工具-->擴展程序.將解壓包內的selenium-ide.crx拖到該頁面.注意,需要打開開發者選項

安裝成功:

可能的報錯

  1. 當瀏覽器驅動添加到環境變量中,單仍然找不到,怎么辦,使用覺得路徑

 from selenium import webdriver
 driver = webdriver.Firefox(executable_path=r'D:\MyTesting\software\geckodriver.exe')
 driver.get('https://www.luffycity.com/home')
import time

# 導入瀏覽器驅動
from selenium import webdriver

# 使用瀏覽器驅動實例化一個谷歌瀏覽器驅動對象: driver,所有關於瀏覽器的操作,都由driver對象完成
driver = webdriver.Chrome()
try:

# 打開瀏覽器,訪問指定的url
driver.get('https://www.baidu.com/')
# 你對當前的頁面要做的操作
input_obj = driver.find_element_by_id('kw')
print(input_obj)
input_obj.send_keys('聽雨危樓')
time.sleep(2)
driver.find_element_by_id('su').click()
time.sleep(2)
driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()

finally:
time.sleep(10)
# 關閉瀏覽器
driver.close()
import time

# 導入瀏覽器驅動
from selenium import webdriver

# 使用瀏覽器驅動實例化一個谷歌瀏覽器驅動對象: driver,所有關於瀏覽器的操作,都由driver對象完成
driver = webdriver.Firefox()
try:

# 打開瀏覽器,訪問指定的url
driver.get('https://www.baidu.com/')
# 你對當前的頁面要做的操作

# 最大化,最小化,指定大小
# driver.maximize_window()
# driver.minimize_window()
# driver.set_window_size(800, 600)
# print(driver.title) # 獲取頁面的title
# print(driver.page_source) # 獲取網頁文本

# 獲取截屏的字節流,需要我們手動寫到文件中
# res = driver.get_screenshot_as_png()
# # print(res)
# f = open('a.png', 'wb')
# f.write(res)
# 直接保存截屏
# driver.save_screenshot('b.png') #

# print(driver.current_url)
# print(driver.current_window_handle)

# driver.find_element_by_id('kw').send_keys('tingyuxxxxxx')
# time.sleep(3)
# driver.close() # 關閉當前的窗口對象
# driver.find_element_by_id('kw').clear() # 清空input框
# driver.refresh() # 刷新

# input_obj = driver.find_element_by_id('kw')
# print(input_obj)
# input_obj.send_keys('聽雨危樓')
# time.sleep(2)
# driver.find_element_by_id('su').click()
# time.sleep(2)
# driver.find_element_by_xpath('//*[@id="1"]/h3/a').click()

finally:
time.sleep(10)
# 退出瀏覽器
driver.quit()
import time
from selenium import webdriver # 驅動瀏覽器

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
time.sleep(2)
browser.execute_script('alert("xxoo不可描述")')

# browser.get('https://www.taobao.com')
# browser.get('http://www.sina.com.cn/')
# time.sleep(5)
# browser.back() # 后退
# time.sleep(3)
# browser.forward() # 前進
# time.sleep(2)
# browser.refresh() # 刷新
# browser.close() # 關閉當前窗口
time.sleep(3)
browser.quit()
import unittest
from BSTestRunner import BSTestRunner
from HTMLTestRunner import HTMLTestRunner


class A(unittest.TestCase):

def test_case(self):
self.assertTrue(1)

def test_case_02(self):
self.assertTrue(0)


if __name__ == '__main__':
suite = unittest.makeSuite(A)
f = open('report.html', 'wb')
f1 = open('report1.html', 'wb')
BSTestRunner(stream=f, title='xx', description='xx00不可描述', verbosity=3).run(suite)
suite = unittest.makeSuite(A)
HTMLTestRunner(stream=f1, title='xx', description='xx00不可描述', verbosity=3).run(suite)
f.close()
f1.close()

常用類與方法

 
from selenium import webdriver # 驅動瀏覽器 from selenium.webdriver import ActionChains # 鼠標的相關操作,比如滑動驗證 from selenium.webdriver.common.by import By # 選擇器,以什么方式選擇標簽元素 from selenium.webdriver.common.keys import Keys # 鍵盤相關 from selenium.webdriver.support import expected_conditions as EC # 各種判斷,一般跟等待事件連用,比如說等待某個元素加載出來 from selenium.webdriver.support.wait import WebDriverWait # 等待事件,可以與EC連用 browser = webdriver.Chrome() wait = WebDriverWait(browser, 10) browser.get('https://www.baidu.com') browser.maximize_window() # 窗口最大化 print(browser.current_url) # 獲取當前頁URL print(browser.title) # 獲取頁面的title print(browser.name) # 獲取driver對象:chrome print(browser.current_window_handle) # 獲取當前窗口 print(browser.get_cookies()) # 獲取cookies print(browser.page_source) # 獲取當前頁面內容 browser.refresh() # 刷新 browser.save_screenshot('error.png') # 保存截圖 browser.close() # 關閉當前窗口 browser.quit() # 退出瀏覽器驅動,關閉所有關聯窗口

選擇器

 
from selenium import webdriver # 驅動瀏覽器 from selenium.webdriver.support.wait import WebDriverWait # 等待事件 browser = webdriver.Chrome() wait = WebDriverWait(browser, 10) browser.get('https://www.baidu.com') browser.find_element_by_id('su') # id選擇器 browser.find_element_by_class_name('xx') # 類選擇器,1個 browser.find_elements_by_class_name('xx') # 類選擇器,多個 browser.find_element_by_link_text('xxx') # 鏈接文本選擇器 browser.find_element_by_xpath('xxxx') # xpath選擇器 browser.find_element_by_tag_name('h1') # 標簽選擇器,獲取1個 browser.find_elements_by_tag_name('h1') # 標簽選擇器,獲取多個 browser.find_element_by_css_selector('xxx') # 樣式選擇器

在選擇器的選用時,要記得獲取一個還是多個,要區分開find_elements還是find_element。這個s容易忽略。

另外,上面的選擇器,都可以寫成下面的形式:

from selenium.webdriver.common.by import By # 選擇器,以什么方式選擇標簽元素 browser.find_element(by=By.ID, value=None) # 選擇器類型, value值

常用的選擇器有:

By.ID
By.LINK_TEXT
By.CLASS_NAME
By.XPATH
By.CSS_SELECTOR
By.TAG_NAME

我們可以通過標簽選擇器來做:

import time from selenium import webdriver # 驅動瀏覽器 from selenium.webdriver import ActionChains # 鼠標的相關操作,比如滑動驗證 from selenium.webdriver.common.by import By # 選擇器,以什么方式選擇標簽元素 from selenium.webdriver.common.keys import Keys # 鍵盤相關 from selenium.webdriver.support import expected_conditions as EC # 各種判斷,一般跟等待事件連用,比如說等待某個元素加載出來 from selenium.webdriver.support.wait import WebDriverWait # 等待事件 browser = webdriver.Chrome() wait = WebDriverWait(browser, 10) browser.get('https://www.baidu.com') input = browser.find_element_by_id('kw') # id選擇器 input.send_keys('張開嘴') # 如果獲取到的是個input框,就可以往里面填值 time.sleep(1) input.clear() # 清空值 submit = browser.find_element(By.ID, 'su') submit.click() # 點擊事件 # 有的時候,click事件可能會有問題,我們使用鍵盤事件來處理 submit.send_keys(Keys.ENTER) print(input.get_attribute('name')) # 獲取name屬性 print(input.text) # 獲取內容,但這里的input沒有text print(input.tag_name) print(input.get_property('name')) # 獲取給定屬性,用法類似get_attribute print(browser.find_element_by_class_name('mnav').text) # 找個有text的

當獲取了標簽對象后,我們可以獲取這個標簽的屬性、內容、css樣式和子標簽(子標簽也支持這些操作),示例來自pythonav登錄頁

import time from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) try: driver.get('https://pythonav.com/login/') # 根據 class 屬性獲取 a 標簽對象 a_obj = driver.find_element_by_class_name('navbar-brand') # 獲取 a 標簽的href屬性 print(a_obj.get_attribute('href')) print(a_obj.text) # 獲取標簽的文本內容 print(a_obj.tag_name) # 獲取標簽的名稱 # 獲取 css 樣式 print(a_obj.value_of_css_property('padding')) print(a_obj.value_of_css_property('font-size')) # 如果這個標簽有 submit 屬性,那么就可以點擊它了,比如我們點擊form表單中有submit屬性的標簽 driver.find_element_by_xpath('//*[@id="fm"]/div[5]/div/input').submit() # 獲取該標簽下的子標簽,或者子標簽元素 div_obj = driver.find_element_by_class_name('col-xs-3') print(div_obj.find_element_by_tag_name('input')) print(div_obj.find_element_by_tag_name('input').get_attribute('value')) # 獲取驗證碼圖片的大小 print(driver.find_element_by_id('image_code').size) # # 保存驗證碼圖片 driver.find_element_by_id('image_code').screenshot('./a.png') except Exception as e: print(e) finally: time.sleep(10) driver.quit() # 代碼截止到2019/12/19號有效

Keys

 

鍵盤事件有:

from selenium.webdriver.common.keys import Keys # 鍵盤相關 print(dir(Keys)) ''' [ 'ADD', 'ALT', 'ARROW_DOWN', 'ARROW_LEFT', 'ARROW_RIGHT', 'ARROW_UP', 'BACKSPACE', 'BACK_SPACE', 'CANCEL', 'CLEAR', 'COMMAND', 'CONTROL', 'DECIMAL', 'DELETE', 'DIVIDE', 'DOWN', 'END', 'ENTER', 'EQUALS', 'ESCAPE', 'F1', 'F10', 'F11', 'F12', 'F2', 'F3', 'F4', 'F5', 'F6', 'F7', 'F8', 'F9', 'HELP', 'HOME', 'INSERT', 'LEFT', 'LEFT_ALT', 'LEFT_CONTROL', 'LEFT_SHIFT', 'META', 'MULTIPLY', 'NULL', 'NUMPAD0', 'NUMPAD1', 'NUMPAD2', 'NUMPAD3', 'NUMPAD4', 'NUMPAD5', 'NUMPAD6', 'NUMPAD7', 'NUMPAD8', 'NUMPAD9', 'PAGE_DOWN', 'PAGE_UP', 'PAUSE', 'RETURN', 'RIGHT', 'SEMICOLON', 'SEPARATOR', 'SHIFT', 'SPACE', 'SUBTRACT', 'TAB', 'UP' ] '''

來個鍵盤事件示例:

import time from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() try: driver.get('https://pythonav.com/login/') input_obj = driver.find_element_by_id('id_username') time.sleep(2) input_obj.send_keys('selenium is cool') time.sleep(2) input_obj.send_keys(Keys.CONTROL, 'a') time.sleep(2) input_obj.send_keys(Keys.DELETE) time.sleep(3) input_obj.send_keys('no 。。。。。') time.sleep(3) pwd_obj = driver.find_element_by_id('id_password') pwd_obj.send_keys('selenium is very cool') pwd = pwd_obj.get_attribute('value') print(pwd) js = "return $('#id_password').val()" res = driver.execute_script(js) print(res) js2 = "alert('{}')".format(res) driver.execute_script(js2) finally: time.sleep(10) driver.quit()

鼠標相關事件

 
from selenium.webdriver import ActionChains # 鼠標的相關操作,比如滑動驗證 print(dir(ActionChains)) ''' [ 'click', 'click_and_hold', 'context_click', 'double_click', 'drag_and_drop', 'drag_and_drop_by_offset', 'key_down', 'key_up', 'move_by_offset', 'move_to_element', 'move_to_element_with_offset', 'pause', 'perform', 'release', 'reset_actions', 'send_keys', 'send_keys_to_element' ] '''

EC

 

再來看EC:

from selenium.webdriver.support import expected_conditions as EC # 各種判斷,一般跟等待事件連用,比如說等待某個元素加載出來 print(dir(EC)) ''' ['NoAlertPresentException', 'NoSuchElementException', 'NoSuchFrameException', 'StaleElementReferenceException', 'WebDriverException', 'WebElement', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_element_if_visible', '_find_element', '_find_elements', 'alert_is_present', 'element_located_selection_state_to_be', 'element_located_to_be_selected', 'element_selection_state_to_be', 'element_to_be_clickable', 'element_to_be_selected', 'frame_to_be_available_and_switch_to_it', 'invisibility_of_element', 'invisibility_of_element_located', 'new_window_is_opened', 'number_of_windows_to_be', 'presence_of_all_elements_located', 'presence_of_element_located', 'staleness_of', 'text_to_be_present_in_element', 'text_to_be_present_in_element_value', 'title_contains', 'title_is', 'url_changes', 'url_contains', 'url_matches', 'url_to_be', 'visibility_of', 'visibility_of_all_elements_located', 'visibility_of_any_elements_located', 'visibility_of_element_located'] '''

expected_conditions中封裝了各種判斷,一般常應用於斷言中和等待機制搭配使用。比如判斷某個元素是否存在,存在則返回該標簽對象,不存在則報報錯,並且可以自定制報錯:

import time from selenium import webdriver # 驅動瀏覽器 from selenium.webdriver import ActionChains # 鼠標的相關操作,比如滑動驗證 from selenium.webdriver.common.by import By # 選擇器,以什么方式選擇標簽元素 from selenium.webdriver.common.keys import Keys # 鍵盤相關 from selenium.webdriver.support import expected_conditions as EC # 各種判斷,一般跟等待事件連用,比如說等待某個元素加載出來 from selenium.webdriver.support.expected_conditions import NoSuchElementException from selenium.webdriver.support.wait import WebDriverWait # 等待事件 browser = webdriver.Chrome() # wait = WebDriverWait(browser, 10) # browser.get('https://www.baidu.com') try: print(EC.presence_of_element_located((By.ID, 'xxx'))(browser)) # 判斷某個元素是否被加到了dom樹里,並不代表該元素一定可見 except NoSuchElementException as e: print('找不到這個標簽')

如上例,當前頁面中沒有id名為xxx的,所以報錯,需要注意的是,報錯也是一個對象,要想得到False結果,需要執行這個對象並且將瀏覽器驅動對象傳進去。

其他的判斷:

import time from selenium import webdriver # 驅動瀏覽器 from selenium.webdriver import ActionChains # 鼠標的相關操作,比如滑動驗證 from selenium.webdriver.common.by import By # 選擇器,以什么方式選擇標簽元素 from selenium.webdriver.common.keys import Keys # 鍵盤相關 from selenium.webdriver.support import expected_conditions as EC # 各種判斷,一般跟等待事件連用,比如說等待某個元素加載出來 from selenium.webdriver.support.wait import WebDriverWait # 等待事件 browser = webdriver.Chrome() wait = WebDriverWait(browser, 10) # browser.get('https://www.baidu.com') print(EC.title_contains('XX')(browser)) # 判斷當前頁面的title是否包含預期字符串 print(EC.visibility_of_element_located((By.ID, 'su'))(browser)) # 判斷某個元素是否可見(代表元素非隱藏,元素的寬和高都不等於0) print(EC.invisibility_of_element_located(((By.ID, 'xxx')))(browser)) # 判斷某個元素中是否不存在於dom樹或不可見 print(EC.text_to_be_present_in_element((By.ID, 'su'), '百度一下')(browser)) # 判斷某個元素中的text是否包含了預期的字符串, 示例中的標簽沒有text值 print(EC.text_to_be_present_in_element_value((By.ID, 'su'), '百度一下')) # 判斷某個元素中的value屬性是否包含了預期的字符串 print(EC.alert_is_present()(browser)) # 判斷頁面上是否存在alert print(EC.element_to_be_clickable((By.ID, 'su'))(browser)) # 判斷某個元素中是否可見並且是enable的,這樣的話才叫clickable

其他案例

 

瀏覽器的前進后退和刷新

 

我們可以使用selenium自動的模擬前進(forward)后退(back)和刷新(refresh)三個動作:

import time from selenium import webdriver # 驅動瀏覽器 browser = webdriver.Chrome() browser.get('https://www.baidu.com') browser.get('https://www.taobao.com') browser.get('http://www.sina.com.cn/') time.sleep(5) browser.back() # 后退 time.sleep(3) browser.forward() # 前進 time.sleep(2) browser.refresh() # 刷新 browser.close() # 關閉當前窗口 time.sleep(3) browser.quit()

執行js代碼

 

在有些時候,需要執行一些js代碼來完成任務。

from selenium import webdriver # 驅動瀏覽器 browser = webdriver.Chrome() browser.get('https://www.zhihu.com/explore') browser.execute_script('alert("xxoo")')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM