python+selenium 基本API總結(二)

"29.模擬鍵盤單個按鍵/組合按鍵操作,"
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
url="https://www.sogou.com"
driver=webdriver.Chrome()
driver.get(url)
driver.find_element_by_id("query").send_keys("自動")
# 刪除多輸入的一個 動
driver.find_element_by_id("query").send_keys(Keys.BACK_SPACE)
time.sleep(3)
# 輸入空格鍵+“動化”
driver.find_element_by_id("query").send_keys(Keys.SPACE)
driver.find_element_by_id("query").send_keys("動化")
time.sleep(3)
# ctrl+a 全選輸入框內容
driver.find_element_by_id("query").send_keys(Keys.CONTROL, 'a')
time.sleep(3)
# ctrl+x 剪切輸入框內容
driver.find_element_by_id("query").send_keys(Keys.CONTROL, 'x')
time.sleep(3)
# ctrl+v 粘貼內容到輸入框
driver.find_element_by_id("query").send_keys(Keys.CONTROL, 'v')
time.sleep(3)
# 點擊鍵盤向下箭頭
driver.find_element_by_id("query").send_keys(Keys.ARROW_DOWN)
time.sleep(3)
driver.find_element_by_id("query").send_keys(Keys.ARROW_DOWN)
# 通過回車鍵來代替單擊操作
driver.find_element_by_id("query").send_keys(Keys.ENTER)


"30.模擬組合按鍵操作,"

"""第一種方式,設置並讀取剪切板,鍵盤按下;鍵盤釋放"""
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver import ActionChains
import win32con
import win32clipboard as w
import time
import win32api

def setText(sourceStr):
    "設置剪切板內容"
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_UNICODETEXT,sourceStr)
    w.CloseClipboard()

def getText():
    "讀取剪切板內容"
    w.OpenClipboard()
    content=w.GetClipboardData(win32con.CF_TEXT)
    w.CloseClipboard()
    return content

VK_CODE={"enter":0x0D,"ctrl":0x11,"a":0x41,"v":0x56,"x":0x58}

def keyDown(keyName):
    "鍵盤鍵按下"
    win32api.keybd_event(VK_CODE[keyName],0,0,0)

def keyUp(keyName):
    "鍵盤鍵擡起"
    win32api.keybd_event(VK_CODE[keyName],0,win32con.KEYEVENTF_KEYUP,0)

# 程序代碼:先將要剪切的內容設置到剪切板中,然後再剪切出來,粘貼;
url="http:www.sogou.com"
driver=webdriver.Chrome()
driver.get(url)
# 定義即將要被設置到剪切板中的內容
content="測試之路"
# 將content變量中的內容設置到剪切板中
setText(content)
# 從剪切板中讀取設置到剪切板中的內容
getText=getText()

driver.find_element_by_id('query').click()
# 按下Ctrl+v組合鍵
keyDown("ctrl")
keyDown("v")
# 釋放Ctrl+v組合鍵
keyUp("ctrl")
keyUp("v")

time.sleep(2)
driver.find_element_by_id("stb").click()
# 或者:
# 全選
keyDown("ctrl")
keyDown("a")
keyUp("ctrl")
keyUp("a")
# 剪切
keyDown("ctrl")
keyDown("x")
keyUp("ctrl")
keyUp("x")
# 粘貼
keyDown("ctrl")
keyDown("v")
keyUp("ctrl")
keyUp("v")

"""第二種方式:全選、剪切、複製"""

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains

url="http://www.sogou.com"
driver=webdriver.Chrome()
driver.get(url)
driver.find_element_by_id("query").send_keys("測試開發")
# 全選
ActionChains(driver).key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()
# 剪切
ActionChains(driver).key_down(Keys.CONTROL).send_keys("x").key_up(Keys.CONTROL).perform()
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").click()
# 複製
ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform()


"31.模擬鼠標右鍵,未實踐成功;不過是一個思路,可用鍵盤事件另外的操作實現"
from selenium import webdriver
import win32con
import win32clipboard as w
from selenium.webdriver import ActionChains

def setText(sourceStr):
    "設置剪切板內容"
    w.OpenClipboard()
    w.EmptyClipboard()
    w.SetClipboardData(win32con.CF_UNICODETEXT,sourceStr)
    w.CloseClipboard()

url="http://www.sogou.com"
driver=webdriver.Ie()
driver.get(url)
setText("測試開發")
driver.maximize_window()
searchBox=driver.find_element_by_id("query")
searchBox.click()
# 執行鼠標右鍵點擊操作
# time.sleep(2)
ActionChains(driver).context_click(searchBox).perform()
# time.sleep(2)

# 發送粘貼命令,字符P指代粘貼操作
ActionChains(driver).send_keys("P").perform()
driver.find_element_by_id("stb").click()


"32.模擬鼠標左鍵按下與釋放"
from selenium import webdriver
from selenium.webdriver import ActionChains
import time

url="http://127.0.0.1/test_mouse.html"
driver=webdriver.Chrome()
driver.get(url)
div=driver.find_element_by_id("div1")
for i in range(2):
    # 在定位元素上執行按下鼠標左鍵,並保持
    ActionChains(driver).click_and_hold(div).perform()
    time.sleep(2)
    # 釋放一直按下的鼠標左鍵
    ActionChains(driver).release(div).perform()
    time.sleep(2)


"33.保持鼠標停留在某個元素上"
from selenium import webdriver
from selenium.webdriver import ActionChains
import time

url="http://127.0.0.1/test_mouse_hover.html"
driver=webdriver.Chrome()
driver.get(url)

# find_element_by_partial_link_text就是選擇這個元素的link text中一部分字段,
# 相當於模糊匹配,不過字段選擇要具有唯一性
link1=driver.find_element_by_partial_link_text("指過來1")
link2=driver.find_element_by_partial_link_text("指過來2")
p=driver.find_element_by_xpath('//p[contains(text(),"消失了")]')
ActionChains(driver).move_to_element(link1).perform()
time.sleep(2)
ActionChains(driver).move_to_element(p).perform()
time.sleep(2)
ActionChains(driver).move_to_element(link2).perform()
time.sleep(2)
ActionChains(driver).move_to_element(p).perform()
time.sleep(2)


"34.判斷頁面元素是否存在,封裝函數"
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

def isElementPresent(driver,by,value):
    "判斷元素是否存在,存在則返回True,不存在則返回False"
    try:
        driver.find_element(by,value)
    except NoSuchElementException:
        return False
    else:
        return True

"""
參數by 可以爲
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
"""

driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
res=isElementPresent(driver,"id","kw")
if res == True:
    print ("查找的元素存在頁面上")
else:
    print ("查找的元素不存在頁面上")


"35.隱式等待,針對頁面的,等待頁面加載完成,設定最長等待時間,超出則引發TimeoutException"
from selenium import webdriver

driver=webdriver.Chrome()
driver.implicitly_wait(5)
driver.get("https://www.baidu.com")


"36.顯示等待,針對元素的"
"""
selenium.webdriver.support.wait.WebDriverWait(類)
__init__
driver: 傳入WebDriver實例,即我們上例中的driver
timeout: 超時時間,等待的最長時間(同時要考慮隱性等待時間)
poll_frequency: 調用until或until_not中的方法的間隔時間,默認是0.5秒
ignored_exceptions: 忽略的異常,如果在調用until或until_not的過程中拋出這個元組中的異常,
則不中斷代碼,繼續等待,如果拋出的是這個元組外的異常,則中斷代碼,拋出異常。默認只有NoSuchElementException。
until
method: 在等待期間,每隔一段時間調用這個傳入的方法,直到返回值不是False
message: 如果超時,拋出TimeoutException,將message傳入異常
until_not 與until相反,until是當某元素出現或什麼條件成立則繼續執行,until_not是當某元素消失或什麼條件不成立則繼續執行,參數也相同,不再贅述。
method
message
"""
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException,TimeoutException
import traceback
import time

driver=webdriver.Chrome()
driver.get("https:www.sogou.com")
wait=WebDriverWait(driver,5,0.2)
wait.until(EC.title_is("搜狗搜索引擎 - 上網從搜狗開始"))
try:
    wait.until(EC.visibility_of(driver.find_element_by_id("query"))).send_keys("顯示等待")
    # wait.until(EC.element_to_be_clickable((By.ID,"stb"))).click()
    wait.until(lambda x:x.find_element_by_id("stb")).click()
except NoSuchElementException:
    print ("元素不存在")
except TimeoutException:
    print ("超時")
except Exception:
    print (traceback.print_exc())
else:
    print ("搜索成功")
    driver.quit()


"37.使用title屬性識別或關鍵字識別來操作新彈出的瀏覽器窗口"
import time
import unittest
import traceback
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import  By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException,NoSuchElementException

class VisitSogouByChrome(unittest.TestCase):

    def setUp(self):
        self.driver=webdriver.Chrome()
        self.wait=WebDriverWait(self.driver,10)

    def test_identifyWindowHandleByTitle(self):
        # 本地測試網頁
        url="http://127.0.0.1/test_popup_window.html"
        self.driver.get(url)
        self.wait.until(EC.element_to_be_clickable((By.XPATH,'//a[text()="sogou 搜索"]'))).click()
        all_handles=self.driver.window_handles
        # print (self.driver.current_window_handle)
        try:
            for handle in all_handles:
                self.driver.switch_to.window(handle)
                time.sleep(2)
                # 利用關鍵字來識別
                if "搜狗搜索" in self.driver.page_source:
                # 利用頁面title屬性來識別
                # if self.driver.title=="搜狗搜索引擎 - 上網從搜狗開始":
                    self.wait.until(lambda x:x.find_element_by_id("query")).send_keys("自動化")
                    self.wait.until(EC.element_to_be_clickable((By.ID,"stb"))).click()
                    time.sleep(2)
        except TimeoutException:
            print ("超時")
        except NoSuchElementException:
            print ("未找到元素")
        except:
            print (traceback.format_exc())
        else:
            self.driver.switch_to.window(all_handles[0])
            time.sleep(2)
            self.assertEqual(self.driver.title,"你喜歡的水果","網頁標題不同")

    def tearDown(self):
        self.driver.quit()

if __name__=="__main__":
    unittest.main()


"38.操作frame中的頁面元素"
import time
from selenium import webdriver
from selenium.webdriver.support.wait import  WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 本地測試網頁
url="http://127.0.0.1/frameset.html"
driver=webdriver.Chrome()
driver.get(url)
# 1.用frame的索引來定位,第一個是0
driver.switch_to.frame(0)
driver.find_element_by_xpath('//input[@type="button"]').click()
alertWindow=WebDriverWait(driver,10).until(EC.alert_is_present())
time.sleep(2)
alertWindow.accept()
# 從frame中切回主文檔
driver.switch_to.default_content()

# 2.用frame的id來定位
driver.switch_to.frame("middleframe")
inputBox=WebDriverWait(driver,5).until(EC.visibility_of(driver.find_element_by_xpath('//input[@type="text"]')))
inputBox.send_keys("測試")
driver.switch_to.default_content()
time.sleep(2)

# 3.用WebElement對象來定位;通過標籤名找到頁面中所有的frame元素,然後通過索引進入該frame
driver.switch_to.frame(driver.find_elements_by_tag_name("frame")[2])
WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.ID,"java"))).click()
time.sleep(2)
driver.switch_to.default_content()


"39.使用frame中的html源碼內容操作frame"
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url="http://127.0.0.1/frameset.html"
driver=webdriver.Chrome()
driver.get(url)
frames=driver.find_elements_by_tag_name("frame")
# print (frames) # 返回的是列表類型
for frame in frames:
    driver.switch_to.frame(frame)
    if "中間 frame" in driver.page_source:
        print ("切換成功")
        # 操作frame中的頁面元素
        inputBox=WebDriverWait(driver,5).until(EC.visibility_of(driver.find_element_by_xpath('//input[@type="text"]')))
        inputBox.send_keys("測試")
        break
    else:
        driver.switch_to.default_content()


"40.操作javascript的alert彈窗"
import time
from selenium import webdriver
from selenium.common.exceptions import NoAlertPresentException

url="http://127.0.0.1/test_alert.html"
driver=webdriver.Chrome()
driver.get(url)
driver.find_element_by_id("button").click()
try:
    # 獲取alert對象
    alert=driver.switch_to.alert
    print (alert.text)  # 獲取alert框的提示語
    alert.accept()      # 關閉alert框
    time.sleep(2)
except NoAlertPresentException:
    print ("alert框未被找到")
else:
    driver.quit()


"41.操作javascript的confirm彈窗"
from selenium import webdriver
import time

url="http://127.0.0.1/test_confirm.html"
driver=webdriver.Chrome()
driver.get(url)
driver.find_element_by_id("button").click()
# 獲取alert對象
alert=driver.switch_to.alert
print (alert.text)
# 點擊confirm框上的確定按鈕,以關閉confirm框
alert.accept()
time.sleep(2)
driver.find_element_by_id("button").click()
alert=driver.switch_to.alert
print (alert.text)
# 點擊confirm框上的取消按鈕,以關閉confirm框
alert.dismiss()


"42.操作javascript的prompt彈窗 "
from selenium import webdriver
import time
# chrome運行看不出效果,firefox可以
url="http://127.0.0.1/test_prompt.html"
driver=webdriver.Firefox()
driver.get(url)
driver.find_element_by_id("button").click()
# 獲取alert對象
alert=driver.switch_to.alert
assert alert.text=="這是一個 prompt 彈出框","彈窗信息不匹配"
alert.send_keys("自動化測試")
time.sleep(2)
alert.accept()
# alert.dismiss()


"43.操作瀏覽器的cookie"
from selenium import webdriver

url="http://www.sogou.com"
driver=webdriver.Chrome()
driver.get(url)
# print (driver.get_cookies())
# 獲取所有cookies,列表類型
cookies=driver.get_cookies()
for cookie in cookies:
    # print (cookie)  # 字典類型
    print (cookie["domain"],cookie["expiry"],cookie["name"])

# 根據cookie的name值獲取該條cookie信息
ck=driver.get_cookie("browerV")
print (ck)

# 刪除cookie第一種方式:通過cookie的name屬性
driver.delete_cookie("SUV")
cookies=driver.get_cookies()
print (cookies)

# 刪除cookie第二種方式:一次性刪除全部cookie信息
driver.delete_all_cookies()
cookies=driver.get_cookies()
print (cookies)   # 爲空列表

# 添加自定義的cookie信息
driver.add_cookie({"name":"test","value":"123456"})
print (driver.get_cookies())


"44.指定頁面加載時間"
import unittest,time
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

class SetPageLoadTime(unittest.TestCase):

    def setUp(self):
        self.driver=webdriver.Firefox()
        self.wait=WebDriverWait(self.driver,10)

    def test_PageLoadTime(self):
        # 設定頁面加載限制時間爲4秒
        self.driver.set_page_load_timeout(4)
        try:
            self.driver.get("http://mail.126.com")

        except TimeoutException:
            # 通過執行javaScript來停止加載,然後繼續執行後續動作
            self.driver.execute_script('wondow_stop()')

        iframe = self.wait.until(EC.visibility_of(self.driver.find_element_by_xpath('//iframe[contains(@id,"x-URS-iframe")]')))
        self.driver.switch_to.frame(iframe)
        username = self.wait.until(EC.visibility_of(self.driver.find_element_by_xpath('//input[@name="email"]')))
        username.clear()
        username.send_keys("yzg18730603667")

        passwd = self.wait.until(EC.visibility_of(self.driver.find_element_by_xpath('//input[@name="password"]')))
        passwd.clear()
        passwd.send_keys("807237157@yzg")

        loginButton = self.wait.until(EC.element_to_be_clickable((By.XPATH,'//a[@id="dologin"]')))
        loginButton.click()
        time.sleep(3)

    def tearDown(self):
        self.driver.quit()

if __name__=="__main__":
    unittest.main()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章