seleniumselenium各種技巧,滑動,提示框,窗口大小,iframe切換等等


1 、打開瀏覽器

方法一:默認安裝到C盤,Chrome

from selenium import webdriver
# 打開瀏覽器
driver = webdriver.Chrome()
#放大瀏覽器
driver.maximize_window()
# 打開百度瀏覽器
driver.get("http://www.jianshu.com")
driver.implicitly_wait(10)

方法二:Chrome瀏覽器沒有安裝到C盤

from selenium import webdriver
options = webdriver.ChromeOptions()
options.binary_location = r"E:\soft\GoogleChrome_72\ChromePortable\App\Google Chrome\chrome.exe"
driver = webdriver.Chrome(executable_path=r"E:\soft\python3.6\chromedriver.exe",chrome_options=options)
driver.get("https://www.baidu.com")
#瀏覽器窗口最大化
driver.maximize_window()
#隱式等待10s
driver.implicitly_wait(10)

2、獲取元素信息

    1. text 屬性,顯示該元素在web頁面顯示出來的文本內容

    2. get_attribute方法

      獲取某個屬性的值:

        element.get_attribute(元素屬性)

        element.get_attribute('href')

        element.get_attribute('style')

      獲取該元素對應HTML源代碼:

        element.get_attribute('outerHTML')

      獲取該元素的內部部分的HTML源代碼:

        element.get_attribute('innerHTML')

3、BeautifulSoup4庫  

    這種方式使用的頻率很少,大家可以百度查找詳細的介紹信息

4、隱士等待時間

    driver.implicitly_wait(10)

5、顯示等待

    from selenium.webdriver.support.ui import WebDriver

    from selenium.webdriver.support import expected_conditions as EC

    from selenium.webdriver.common.by import By    

    ele = WebDriverWait(driver,60)

    until(EC.presence_of_element_located((By.ID,'username')))

    #等待60s,知道一個元素出現,id為username的元素

      舉個實例:  

#為id為1的元素先設置隱士等待=60秒,無論找到未找到,隱士等待時間都會重置為10秒
driver.implicitly_wait(60) try: ele = driver.find_element_by_id('1') print (ele.text) if ele.text.startswith('松勤網 - 松勤軟件測試') print('pass') else: print('fail') except: print('exception happend') finally: driver.implicitly_wait(10)

6、frame處理 : 網頁中內嵌的網頁,frame/iframe

      切換frame

        driver.switch_to.frame(frame_reference)

          1. frame元素的name屬性或者ID屬性

          2. 索引值(從0開始)

          3. frame所對應的WebElement :   driver.find_element_by_tag_name("iframe")

      切換回主html里面:  driver.switch_to.default_content() 

                   切換到上一層frame框:driver.switch_to.parent_frame()

from selenium import webdriver
from test import mysql_test as myS
import time
driver = webdriver.Chrome(executable_path=r"E:\soft\python3.6\chromedriver.exe")
driver.get("https://mail.qq.com/cgi-bin/loginpage")
#瀏覽器窗口最大化
driver.maximize_window()
#隱式等待10s
driver.implicitly_wait(10)

#切換iframe,切換后點擊切換后的iframe對應的元素
driver.switch_to.frame(driver.find_element_by_id("login_frame"))
driver.find_element_by_id("u").send_keys("123456")
#切換原html
driver.switch_to.default_content()
#點擊微信登錄
driver.find_element_by_id("wxLoginTab").click()
#切換到iframe框架
wei = driver.find_element_by_id("login_wx_iframe")
driver.switch_to.frame(wei)
#獲取標題
print (driver.title)
#獲取當前的URL
print(driver.current_url)
#截圖
driver.get_screenshot_as_file('d://ssl.png')
#獲取窗口的大小,返回字典{'width': 1936, 'height': 1056}
size = driver.get_window_size()
print (size)
driver.set_window_size(size['width'],400)

7、切換窗口,句柄handle

  切換到新的窗口里面操作

    1.循環遍歷  driver.window_handles

    2.driver.switch_to.window(handle)方法切入新窗口

    3.檢查該窗口特點,是否為要切入的那個

  切換最初的窗口

    保存主窗口的handle

  關閉窗口

    close方法 

#獲取瀏覽器所有的handle
driver.get("http://www.baidu.com")
driver.implicitly_wait(10)
driver.find_element_by_id("kw").send_keys("松勤自動化\n")
driver.find_element_by_css_selector("[id='1']>h3>a").click()
print(driver.window_handles)

#循環遍歷所有的handle,如果瀏覽器的title等於某一個title,或者某一個title里面存在某一個元素
for handle in driver.window_handles:
#切換新窗口
driver.switch_to.window(handle)
if driver.title == '預期窗口':
break

#循環遍歷所有的handle,跳轉到窗口,如果元素找到則跳轉
for handle in driver.window_handles:
#切換新窗口
driver.switch_to.window(handle)
#判斷當前窗口的特征是否為目標窗口
eles=driver.find_elements_by_css_selector("span>[href='/course/explore']")
if eles:
    eles[0].click()
    break

7、清除元素中的字符串

    clear方法  :  input1.clear()

8、獲取文本框中輸入的內容

    get_attribute() : 獲取input元素里面輸入的文本內容

    input1.get_attribute('value')

9、單選框:type類型是radio

    type = "radio"

    click()方法選擇 : 不管原來該元素是否選中,直接去點擊該元素沒有問題都可以確保該單選框選中

              

driver.find_element_by_css_selector("[value='male']").click()
driver.find_element_by_css_selector("[value='female']").click()
 #是否被選中
male = driver.find_element_by_css_selector("[value='male']")
if male.is_selected:
  print ("單選框被選中")
else:
  print ("未被選中")

10、勾選框:type類型CheckBox

    type = "checkbox"

    click()方法選擇 

    is_selected()方法來獲取選擇的狀態:

        True :已經選中

        False:未選中

ele1=driver.find_element_by_css_selector("[value='bike]'")
#如果選中pass,未選中則讓其點擊選中
if ele1.is_selected():
    pass
else:
    ele1.click()

#選中所有的勾選框
eles=driver.find_elements_by_tag_name('input')
for ele in eles:  
    #沒有被選中,則讓選中
    if not ele1.is_selected():
        ele1.click()

11、復選框

    select,有multiple可以多選,不寫則單選    

    可以用selenium的Select類

    導入類: from selenium.webdriver.support.ui import Select

    方法deselect_all() : 清掉所有選中的元素

    方法select_by_visible_text("值"):根據復選框中文本信息選中

可以選擇多個的復選框:

    實例如下:

#導入Select類
from selenium.webdriver.support.ui import Select
#獲得相應的WebElement
select = Select(driver.find_element_by_id("multi"))
#去除選擇所有的選項
select.deselect_all()
select.select_by_visible_text("雅閣")
select.select_by_visible_text("寶馬 740")

#獲得相應的WebElement
select = Select(driver.find_element_by_id("single"))
select.select_by_visible_text("男")

#其他幾種選中復選框中內容的方法# 獲得相應的WebElement
select = Select(driver.find_element_by_id("select"))
# 先取消選擇所有的選項
select.deselect_all()
# 通過文本選中 瑪莎拉蒂
select.select_by_visible_text("瑪莎拉蒂")
# 通過 value 值選中 蘭博基尼
select.select_by_value("Lamborghini")
# 通過 index 選擇元素,索引從0開始
select.select_by_index(2)

只能選擇單個復選框

se2=Select(driver.find_element_by_id('single'))
se2.select_by_value('male')

12、獲取標題

    driver.title

13、獲取當前url

    driver.current_url

14、簡單的斷言

    assert driver.title == "百度一下,你就知道"     

   # 當前瀏覽器的標題是否是“百度一下,你就知道”

15、截屏:

  截取整個頁面的方法

      driver.get_screenshot_as_file(r'd:\baidu.png')       

      # 括號里面填寫文件名稱,也可以固定保存路徑

  獲取某一個區域的圖片

      ele=driver.find_element_by_cas_selector('img[class="d-flag"]')

      ele.screenshot(r'D:\music.png')

16、上傳文件,調用系統的Windows框去上傳

需要依賴的第三方庫:  pip  install  pypiwin32

import time
import win32com.client
from selenium import webdriver

# 打開瀏覽器
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://tinypng.com/")
driver.find_element_by_css_selector(".icon").click()
# 因為頁面控件和Windows自帶的框不一致,因此需要等待讓系統的彈窗出來
time.sleep(3)

#開始上傳文件,調用Windows窗口
shell = win32com.client.Dispatch("WScript.Shell")
# 輸入需要上傳文件的路勁,回車換行
shell.SendKeys(r"E:\test.txt"+"\r\n")
time.sleep(3)
driver.quit()

17、瀏覽器的操作,刷新頁面、前進、后退

  • 刷新頁面  refresh
  • 前進:forward
  • 后退:back
import time
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
print(driver.title)
driver.find_element_by_id("kw").send_keys("自動化測試\r\n")
#后退
driver.back()
time.sleep(3)
print(driver.title)
#刷新頁面
driver.refresh()
time.sleep(3)
#前進
driver.forward()
time.sleep(3)
print(driver.title)
driver.quit()

 18、滑動屏幕,改變窗口默認大小

  

import time
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://music.163.com/")
#設置瀏覽器的窗口大小
driver.set_window_size(480,500)
time.sleep(2)
#操作搜索框
driver.find_element_by_id("srch").send_keys("周傑倫\n")
input()
driver.quit()

 報錯:message:element not interactable 表示這個元素在頁面上不可見,需要拖動下拉框才能看到這個元素,

這個時候需要讓元素在頁面上可見,才可操作

  • 需要將頁面最大化去操作: driver.maxmize_window()

滾動條:

  1.使用js,有時候頁面禁止了js腳本,則需要用其他方法2

    可以現在瀏覽器中驗證一下,如果不確定是否可以滑到最下面,

               可以加個循環多滑動幾次。

      

from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
#操作搜索框
driver.find_element_by_id("kw").send_keys("松勤\n")
#滾動頁面,js方法
driver.execute_script("scrollBy(0,2000)")
#點擊下一頁
driver.find_element_by_css_selector("#page>a:nth-child(10)").click()
driver.quit() 

 滾動條:直接滑到頁面底部和頂部

 

#滾動條操作
# 直接滑動到底部
js="var q=document.documentElement.scrollTop=10000"
# 直接滑動到頂部
js="var q=document.documentElement.scrollTop=0"
driver.execute_script(js)

 

 2. 模擬鍵盤

     需要導入庫:   

    import win32api

    import win32con

import time
import win32api
import win32con
from selenium import webdriver
driver=webdriver.Chrome()
driver.maximize_window()
driver.get("https://music.163.com/")
driver.implicitly_wait(10)
driver.switch_to.frame("g_iframe")
time.sleep(1)
#需要點擊一下空白頁面,交互一下
driver.find_element_by_css_selector(".v-hd3 .f-fl").click()
time.sleep(1)
for i in range(5): #循環5次,按鍵盤向下鍵
    win32api.keybd_event(win32con.VK_DOWN,0)
    time.sleep(0.5)
for i in range(5): #循環5次,按鍵盤向上鍵
    win32api.keybd_event(win32con.VK_UP,0)
    time.sleep(0.5)
for i in range(5): #循環5次,按鍵盤空格鍵
    win32api.keybd_event(win32con.VK_SPACE,0)
    time.sleep(0.5)
for i in range(5):  # 循環5次,按鍵盤向右鍵
    win32api.keybd_event(win32con.VK_RIGHT, 0)
    time.sleep(0.5)
for i in range(5): #循環5次,按鍵盤向左鍵
    win32api.keybd_event(win32con.VK_LEFT,0)
    time.sleep(0.5)
driver.quit()

  3.獲取窗口大小

    size=driver.get_window_size() #返回的是一個字典,可以通過鍵值對的思路去獲取數據

import time
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
#設置窗口大小
driver.set_window_size(1400,500)
time.sleep(1)
#獲取窗口大小信息,返回的是一個字典
size=driver.get_window_size()
print(size)
print("width:{},height:{}".format(size['width'],size['height']))
driver.quit()

 19、頁面的二次渲染后,再次定位元素

 一般情況下報錯:stale  element  reference表示頁面進行了二次渲染

解決方法,可以將觸發的這個按鈕再次定位,去觸發,比如下面的刪除按鈕,

放到循環里面,讓其每次觸發。

  

 20、模擬鼠標懸停,拖動

 需要導入ActionChains類:

from selenium.webdriver.common.action_chains import ActionChains
ac = ActionChains()
# click需要傳入需要操作的元素,返回的都是自己本身,因此可以連續調用,
# 需要執行的話必須有perform()方法
ac.click(input1).send_keys("input1").click(input2).send_keys("input2").
click(input3).send_keys("input3").perform()
# 定位到需要懸停的元素
move = driver.find_element_by_id("XXXXX")
# 對定位到的元素執行懸停操作
ActionChains(driver).move_to_element(move).perform()

#拖動
#兩個參數,拖動的起點和終點,鼠標按下的位置和鼠標松開的位置
ac.drag_and_drop(soure,target)

21、凍結頁面

        某些元素在頁面無法定位,則需要凍結頁面,相當於加了一個debug,幾秒后凍結窗口

  #多少秒之后對頁面進行凍結

  setTimeout(function(){debugger},3000)

        

23、讓系統發出聲音,提示用戶做一些操作

import  winsound

winsound.Beep(2200,3000) #(聲音頻率,聲音時間)

例如:輸入驗證碼,讓系統發出一段聲音,提示人去完成驗證碼的工作

import  winsound
from selenium import webdriver
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
#系統自動提示聲音,(分貝,延長時間)
winsound.Beep(1000,8000)
driver.quit()

  

彈出對話框:

對話框一般來說有三種:

  alert,confirm,prompt

操作方法:

driver.switch_to.alert.accept()      #點擊OK

driver.switch_to.alert.text      # 得到對話框內容

driver.switch_to.alert.dismiss()   # 點擊cancel

driver.switch_to.alert.send_keys()   # 輸入內容

1、alert對話框

 

# 針對這種對話框,python提供了一種方式,alert
#觸發alert
driver.find_element_by_id('b1').click()
#切換到alert框上面
al = driver.switch_to.alert
#獲取alert框上面的信息
print(al.text)
#使用accept方法點擊“確定”
al.accept()

2、confirm對話框

# 針對這種對話框,python提供了一種方式,alert
#觸發alert
driver.find_element_by_id('b2').click()
#切換到alert框上面
al = driver.switch_to.alert
#獲取alert框上面的信息
print(al.text)
#使用accept方法點擊“確定”
al.accept()
#使用dismiss方法點擊“取消”
al.dismiss()

3. prompt對話框

driver.find_element_by_id('b3').click()
driver.switch_to.alert.send_keys("hello  promot")
driver.switch_to.alert.accept()
driver.switch_to.alert.dismiss()

后面有新增的內容,可以繼續補充。。。。。。

歡迎大家可以提更多的建議。。。。。。


免責聲明!

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



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