1、文本按鈕操作相關:
- send_keys()輸入文本
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("https://www.baidu.com/") time.sleep(2) dr.find_element_by_id("kw").send_keys("selenium")
- clear()清除文本
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("https://www.baidu.com/") time.sleep(1) dr.find_element_by_id("kw").send_keys("selenium") time.sleep(2) dr.find_element_by_id("kw").clear()
- click()點擊按鈕
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("https://www.baidu.com/") time.sleep(1) dr.find_element_by_id("kw").send_keys("selenium") time.sleep(1) dr.find_element_by_id("su").click()
- submit()類似輸入文本后回車
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("https://www.baidu.com/") time.sleep(1) dr.find_element_by_id("kw").send_keys("selenium") time.sleep(1) dr.find_element_by_id("kw").submit()
- size 返回元素的尺寸
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("https://www.baidu.com/") time.sleep(1) print (dr.find_element_by_id("su").size)
- text 獲取文本
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://192.168.0.161:8081/discuz/forum.php") time.sleep(1) print (dr.find_element_by_id("ls_fastloginfield_ctrl").text)
2、常見的 webdriver 方法
- get_window_size() 獲取瀏覽器窗口大小
- set_window_size(480,800) 設置瀏覽器窗口大小
- maximize_window() 瀏覽器窗口最大化
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("https://www.baidu.com/") time.sleep(1) print (dr.get_window_size()) time.sleep(2) dr.maximize_window() time.sleep(2) dr.set_window_size(800,500)
- get_attribute()獲取元素屬性值
product_name = driver.find_element_by_id('currentItem').get_attribute("title") if name == product_name: print ("ok!") else: raise AssertionError
- back()向后
- forward()向前
- refresh()刷新
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("https://www.baidu.com/") time.sleep(1) dr.find_element_by_link_text("hao123").click() time.sleep(2) dr.back() time.sleep(2) dr.forward() time.sleep(2) dr.refresh()
- close()關閉當前選項卡頁面
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://192.168.0.161:8081/discuz/forum.php") time.sleep(1) dr.find_element_by_link_text("交友").click() time.sleep(2) dr.close() #關閉當前句柄窗口
from selenium import webdriver from time import sleep dr = webdriver.Chrome() #打開第一個網頁"百度" dr.get("https://www.baidu.com") sleep(2) #打開第二個網頁"京東" js = 'window.open("https://www.jd.com")' dr.execute_script(js) sleep(2) #關閉當前句柄的窗口 dr.close()
- quit()關閉所有選項卡頁面
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://192.168.0.161:8081/discuz/forum.php") time.sleep(1) dr.find_element_by_link_text("交友").click() time.sleep(2) dr.quit()
from selenium import webdriver from time import sleep dr = webdriver.Chrome() #打開第一個網頁"百度" dr.get("https://www.baidu.com") sleep(2) #打開第二個網頁"京東" js = 'window.open("https://www.jd.com")' dr.execute_script(js) sleep(2) #關閉當前瀏覽器 dr.quit()
- 窗口滾動操作
- js = "window.scrollTo(300,200)" #300表示左邊距,200表示上邊距
- js = "document.documentElement.scrollTop=200" #向下滑動200px
- js = "document.documentElement.scrollLeft=300" #向右滑動300px
- execute_script(js)
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("https://www.baidu.com/") time.sleep(1) dr.set_window_size(800,500) time.sleep(2) js = "window.scrollTo(300,200)" #300表示左邊距,200表示上邊距 dr.execute_script(js)
from selenium import webdriver from time import sleep dr = webdriver.Chrome() dr.get("https://www.cnblogs.com/ZhengYing0813") # print(dr.get_window_size()) dr.set_window_size(500,500) sleep(1) # js = "document.documentElement.scrollTop=200" #向下滑動200px # js = "document.documentElement.scrollLeft=300" #向右滑動300px # dr.execute_script(js) n = 0 while 1000 > n: n += 100 js = "document.documentElement.scrollTop=" + str(n) dr.execute_script(js) sleep(2) sleep(3) dr.quit()
- title 獲取頁面 title
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://192.168.0.161:8081/discuz/forum.php") time.sleep(1) print ("當前title:" + dr.title)
- current_window_handle 當前頁面的句柄
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://192.168.0.161:8081/discuz/forum.php") time.sleep(1) print ("當前句柄:" + dr.current_window_handle) dr.find_element_by_link_text("交友").click() print ("當前句柄:" + dr.current_window_handle)
- window_handles 當前所有的句柄,返回句柄列表
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://192.168.0.161:8081/discuz/forum.php") time.sleep(1) print ("當前句柄:" + dr.current_window_handle) dr.find_element_by_link_text("交友").click() print ("所有句柄:" + dr.window_handles)
- switch_to_window() 切換窗口(一般通過句柄切換)
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://192.168.0.161:8081/discuz/forum.php") time.sleep(1) print ("首頁title:" + dr.title) dr.find_element_by_link_text("交友").click() dr.switch_to_window(dr.window_handles[1]) print ("此時title:" + dr.title)
3、鼠標相關
- context_click()右擊
- double_click()雙擊
- drag_and_drop()拖拽
- drag_and_drop_by_offset()拖拽
- move_to_element()鼠標懸停
- perform()執行
""" 鼠標懸浮 """ # 第一種方法(二次定位) from selenium import webdriver from time import sleep dr = webdriver.Chrome() dr.maximize_window() dr.get("https://www.baidu.com") sleep(2) dr.find_element_by_link_text("設置").click() dr.find_element_by_link_text("搜索設置").click() sleep(2) dr.quit() # 第二種方法 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains #導入鼠標操作模塊 import time #導入時間模塊 dr = webdriver.Chrome() #webdriver類實例化 dr.get("https://www.baidu.com") time.sleep(1) element = dr.find_element_by_link_text("設置") #定位到鼠標要懸浮的元素 ActionChains(dr).move_to_element(element).perform() #鼠標操作類實例化,傳driver驅動 將鼠標懸浮到元素上 執行懸浮操作 time.sleep(1) dr.find_element_by_link_text("高級搜索").click() #點擊設置按鈕下的元素 time.sleep(3) dr.close()
""" drag_and_drop 拖拽 """ sourse=driver.find_element_by_id('xx') #定位元素要移動的目標位置 target=driver.find_element_by_id('yy') #執行元素的拖放操作 ActionChains(driver).drag_and_drop(sourse,target).perform()
""" drag_and_drop_by_offset 拖拽,處理滑塊驗證 """ from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time dr = webdriver.Chrome() dr.get("https://shopcs.yunyoute.com/login") dr.maximize_window() dr.implicitly_wait(10) time.sleep(2) drag1 = dr.find_element_by_class_name("evenBox") # 定位到滑塊 ActionChains(dr).drag_and_drop_by_offset(drag1,1572,708).perform() # 拖拽到指定坐標 (1572,708)
""" 鼠標右擊操作 """ from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time dr = webdriver.Chrome() dr.get("https://shopcs.yunyoute.com/login") dr.maximize_window() dr.implicitly_wait(10) time.sleep(2) inp = dr.find_element_by_xpath('//*[@id="app"]/div/div[2]/div/div/div/div/div/div[3]/div[1]/input[2]') ActionChains(dr).context_click(inp).perform()
4、selenium 中三種等待方式
(1)線程等待(強制等待):time.sleep(s)
import time from selenium import webdriver dr = webdriver.Chrome() dr.get("https://www.baidu.com") dr.find_element_by_css_selector('[id=kw]').send_keys("selenium") time.sleep(2) dr.quit()
(2)隱式等待:dr.implicitly_wait(s) 等待頁面所以的元素加載完成,則會自動進行下一步操做,如果等待時間超過設置的時間則會報錯
from selenium import webdriver dr = webdriver.Chrome() dr.implicitly_wait(10) dr.get("https://www.baidu.com") dr.find_element_by_css_selector('[id=kw]').send_keys("selenium") dr.quit()
(3)顯式等待:等待頁面特定的某個元素加載后,才會進行下一步操作,如果在設定的時間內沒有找到則會報錯
from selenium import webdriver # 兩種導入WebDriverWait方式 # from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait #通過 as 關鍵字將 expected_conditions 重命名為EC from selenium.webdriver.support import expected_conditions as EC #導入By模塊 from selenium.webdriver.common.by import By dr = webdriver.Chrome() dr.get("https://www.baidu.com") #presence_of_element_located 必須以元組的形式傳入,所以使用到By方法進行定位 try: element = WebDriverWait(driver=dr,timeout=10,poll_frequency=0.5).until(EC.presence_of_element_located((By.ID,"kw"))) element.send_keys("selenium") finally: dr.quit()
- WebDriverWait(driver,timeout,poll_frequency,ignored_exceptions)
- driver:瀏覽器驅動
- timeout:最長超時時間,默認以秒為單位
- poll_frequency:檢測的間隔(步長)時間,默認為 0.5S
- ignored_exceptions:超時后的異常信息,默認情況下拋 NoSuchElementException 異常
- WebDriverWait() 一般由 until() 或 until_not() 方法配合使用
until(method, message=' ') #調用該方法提供的驅動程序作為一個參數,直到返回值為True until_not(method, message=' ') #調用該方法提供的驅動程序作為一個參數,直到返回值為False
- EC 預置條件模塊具有很多類型的判斷:
- presence_of_element_located 判斷當前元素是否存在
- presence_of_all_elements_located 判斷一組元素是否存在
- text_to_be_present_in_element_value 判斷元素值是否有xx文本信息
- presence_of_all_elements_located 判斷一組元素是否存在
5、單 / 復選框相關
dr.get("http://127.0.0.1:8848/html/checkbox.html") list=dr.find_elements_by_xpath("//*[@class='tbmu']/td/label") for i in list: i.click()#勾選全部標簽
6、下拉框處理
(1)select 模塊定位
- Select 提供了三種選擇方法:
- select_by_index(index) ——通過選項的順序,第一個為 0
- select_by_value(value) ——通過 value 屬性
- select_by_visible_text(text) ——通過選項可見文本
from selenium import webdriver from selenium.webdriver.support.select import Select import time dr = webdriver.Chrome() dr.get("http://127.0.0.1:8848/project/html/Drop_down_box.html") time.sleep(1) element = dr.find_element_by_id("birthprovince") Select(element).select_by_index(5) Select(element).select_by_value("山西省") Select(element).select_by_visible_text("河北省")
- Select 提供了四種方法取消選擇:(只能取消選擇多選選項)
- deselect_by_index(index)
- deselect_by_value(value)
- deselect_by_visible_text(text)
- deselect_all()
(2)二次定位(基本思路,先定位 select 框,再定位 select 里的選項)
from selenium import webdriver from selenium.webdriver.support.select import Select import time dr = webdriver.Chrome() dr.get("http://127.0.0.1:8848/project/html/Drop_down_box.html") time.sleep(1) #兩次定位 element = dr.find_element_by_id("birthprovince") element.find_element_by_xpath('//*[@id="birthprovince"]/option[5]').click()
7、frame 處理
(1)switch_to.frame()選擇一個 frame ---> 只能用 id 或 name 定位 frame
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://192.168.0.161:8081/discuz/forum.php") dr.maximize_window() dr.find_element_by_id("ls_username").send_keys("xfs") dr.find_element_by_id("ls_password").send_keys("123456") dr.find_element_by_css_selector('[type="submit"]').click() time.sleep(2) dr.find_element_by_link_text("學員作業專區").click() dr.find_element_by_xpath('//*[@id="newspecial"]/img').click() #發帖 time.sleep(2) dr.find_element_by_id("subject").send_keys("test") time.sleep(1) dr.switch_to_frame("e_iframe") #直接定位frame框架,只能通過id/name定位 time.sleep(1) dr.find_element_by_xpath('/html/body').send_keys(u"測試一下")
(2)假如 iframe 沒有可定位的 id 或 name 那么可以通過 xpath 先定位到 iframe,再將對象傳給 switch_to.frame():如下
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://192.168.0.161:8081/discuz/forum.php") dr.maximize_window() dr.find_element_by_id("ls_username").send_keys("zhengying") dr.find_element_by_id("ls_password").send_keys("zhengying123456") dr.find_element_by_css_selector('[type="submit"]').click() time.sleep(2) dr.find_element_by_link_text("學員作業專區").click() dr.find_element_by_xpath('//*[@id="newspecial"]/img').click() time.sleep(2) dr.find_element_by_id("subject").send_keys("test") time.sleep(1) frame = dr.find_element_by_css_selector("#e_body > div > iframe") #先定位到frame dr.switch_to.frame(frame) #再將frame的對象傳進去 time.sleep(1) dr.find_element_by_xpath('/html/body').send_keys("dmlafjiuwnkdsncqwfcwnoqncsdknfwcnsdkfn")
(3)dr.switch_to.default_content() 取消選擇一個 frame(跳回最外層的頁面)
dr.switch_to.parent_frame() 取消選擇一個 frame(跳出當前 frame)
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains import time dr.get("http://192.168.0.161:8081/discuz/forum.php") dr.maximize_window() dr.find_element_by_id("ls_username").send_keys("zhengying") dr.find_element_by_id("ls_password").send_keys("zhengying123456") dr.find_element_by_css_selector('[type="submit"]').click() time.sleep(2) dr.find_element_by_link_text("學員作業專區").click() dr.find_element_by_xpath('//*[@id="newspecial"]/img').click() time.sleep(2) dr.find_element_by_id("subject").send_keys("test") time.sleep(1) dr.switch_to_frame("e_iframe") #通過frame的id進行傳參 dr.find_element_by_xpath('/html/body').send_keys(u"測試一下") time.sleep(2) dr.switch_to_default_content() time.sleep(2) dr.find_element_by_link_text("學員作業專區").click()
8、彈窗相關
- switch_to.alert.accept() #確定
- switch_to.alert.dismiss() #取消
- switch_to.alert.text #獲取彈框信息
from selenium import webdriver import time dr = webdriver.Chrome() dr.get("http://127.0.0.1:8848/project/html/Alert.html") time.sleep(2) dr.find_element_by_class_name("xxx").click() time.sleep(2) # dr.switch_to_alert().accept() #確定 print (dr.switch_to_alert().text) #捕獲彈窗內容 time.sleep(1) dr.switch_to_alert().dismiss() #取消
9、數據庫操作
- dos窗口下安裝pymysl --> pip install pymysql
- 游標概念:SQL 的游標是一種臨時的數據庫對象,游標的一個常見用途就是保存查詢結果,以便后續調用或者使用(游標是系統為用戶開設的一個數據緩沖區,存放 SQL 語句的執行結果)
- 游標 cursor():該方法會幫我們獲取操作游標這時游標會為我們提供方法:
- 執行腳本命令
- 接受返回值
- db=pymysql.connect("IP 地址","用戶名","密碼","數據庫名",charset='utf8')
- cursor=db.cursor() 獲取游標
- fetchone() 提取第一行數據
- fetchall() 提取所有數據
- fetchmany(size) 根據 size 值提取具體行數
- 注意:當游標cursor中的某條數據被取出后,當前查詢結果中則不能再次提取該條數據
import pymysql def con(ip,user,password,database,port,sql): db = pymysql.connect(ip,user,password,database,int(port),charset='utf8') cursor = db.cursor() cursor.execute(sql) print (cursor.fetchone()) print (cursor.fetchall()) print (cursor.fetchmany(5)) db.close() con("192.168.1.222","root","123456","study",3306,"select * from user;")