selenium的高級操作

今天接着講selenium的常見的一些操作,內容稍微有點多,慢慢細品,寫的還算較爲清晰,請耐心看完

一、鼠標操作

平時我們做功能測試,都是手動點擊鼠標來完成,那麼同樣可以通過代碼來完成;比如,打開百度網站點擊左上角的新聞鏈接,操作鼠標即可

"""

鼠標操作:ActionChains

鼠標右擊:action.context_click()
鼠標雙擊:action.double_click()
鼠標移動到某個節點:move_to_element()
鼠標左鍵按下鼠標:click_and_hold()
鼠標相對當前位置進行移動:move_by_offse()
在一個位置按下鼠標,到另外一個位置釋放:drag_and_drop(ele1,ele2)

release():釋放鼠標
perform():執行動作

"""
import time
from selenium.webdriver import Chrome
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

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

news_ele = driver.find_element(By.XPATH, '//a[text()="新聞"]')

# 創建一個鼠標對象
action = ActionChains(driver)
# click:點擊某個元素
# 點擊某個元素;此時點擊的百度網站的左上角的新聞鏈接,實現用鼠標去點
action.click(news_ele)
# 執行動作
action.perform()

time.sleep(2)
driver.quit()

如果鼠標來懸浮拖拽怎麼來實現,看下圖

同樣通過代碼來實現

import time
from selenium.webdriver import Chrome
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

driver = Chrome()
driver.implicitly_wait(10)
driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")

# 因爲是iframe標籤,所以要進行切換
frame_ele = driver.find_element(By.ID, "iframeResult")
driver.switch_to.frame(frame_ele)
ele1 = driver.find_element(By.ID, "draggable")
ele2 = driver.find_element(By.ID, "droppable")

# 創建一個鼠標對象
action = ActionChains(driver)
# 點擊按住鼠標不放;在ele1處按下鼠標
action.click_and_hold(ele1)
# 移動鼠標到某個ele2上
action.move_to_element(ele2)
# 釋放鼠標
action.release()

# 執行動作
action.perform()

time.sleep(2)
driver.quit()

來看運行後的效果:

 當然了,這種從一個位置拖動到另一個位置,不用這麼麻煩,也可以直接用一個已封裝好的方法去實現:drag_and_drop(ele1,ele2),有興趣的可以自己嘗試,道理是一樣的

接下來,拓展一個問題,可不可以根據座標來移動呢?

答:是可以的

import time
from selenium.webdriver import Chrome
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By

driver = Chrome()
driver.implicitly_wait(10)
driver.get("https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")

# 因爲是iframe標籤,所以要進行切換
frame_ele = driver.find_element(By.ID, "iframeResult")
driver.switch_to.frame(frame_ele)
ele1 = driver.find_element(By.ID, "draggable")
ele2 = driver.find_element(By.ID, "droppable")

# 創建一個鼠標對象
action = ActionChains(driver)
# 按下ele1這個元素
action.click_and_hold(ele1)
# 根據座標來移動
action.move_by_offset(xoffset=100, yoffset=300)

# 釋放鼠標
action.release()
# 執行動作
action.perform()

time.sleep(2)
driver.quit()

因此:關於selenium的鼠標操作,在此做個小總結:

1、要導入ActionChains這個類,from selenium.webdriver import ActionChains;在這個的基礎上再來談鼠標操作

2、執行動作:perform不能忘,沒有這個執行動作是無法點擊鼠標實現操作的

3、如果遇到iframe標籤,要先切換好

4、相對於位置來移動座標,最好不要使用,因爲每種電腦屏幕的分辨率不太一樣,很容易亂的

5、有些方法是已經封裝好的,能簡單使用就最好不要繞圈子,簡單粗暴是最好用的

6、點擊元素的時候,別忘了後邊的括號裏面傳元素

7、其實說白了就是一句話;①導入ActionChains②action.方法③執行動作;想用什麼方法自己去選擇就行

二、選擇下拉框

標準的下拉選擇框,爲什麼要這樣講呢,我們所說的標準的下拉選擇框其實就是select和option組成的,這種的下拉框怎麼來選中下拉列表中的選項呢?

 步驟很簡單:導入一個Select,然後調用方法來選擇,方式一般有常見的這麼3種,較爲簡單

非標準的下拉選擇框:在其他的網站上各種組件各種插件組成,對於這種,我們要怎麼樣來處理呢?

"""

非標準的下拉框,只能一步一步點擊
"""

import time
from selenium.webdriver.common.by import By
from selenium.webdriver import Chrome

driver = Chrome()
driver.implicitly_wait(5)
driver.get("https://www.layui.com/demo/form.html")

# 第一步:點擊選擇框
driver.find_element(By.XPATH, "//input[@placeholder='直接選擇或搜索選擇']")
time.sleep(2)
# 第二步:找到對應的元素進行點擊
driver.find_element(By.XPATH, "//dd[text()='form']").click()

time.sleep(10)
driver.quit()

一步一步來,先點擊出現下拉列表,再從裏面選

三、鍵盤操作

也許有的同學不太理解,什麼叫鍵盤操作?比如說,鍵盤的回車鍵Enter,清除鍵delete等等

import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

driver = Chrome()
driver.implicitly_wait(10)
driver.get("http://www.elong.com/")

# 先定位元素
input_ele = driver.find_element(By.XPATH, '//input[@data-bindid="city"]')
# 清空該元素內容
input_ele.clear()
# 在輸入框輸入深圳
input_ele.send_keys("深圳")
time.sleep(2)
# 輸入完內容後敲個Enter鍵
input_ele.send_keys(Keys.ENTER)
time.sleep(2)

driver.find_element(By.XPATH, '//span[@data-bindid="search"]').click()

time.sleep(10)
driver.quit()

 如果我此時需要粘貼複製呢?要通過鍵盤操作ctrl+c或者ctrl+v,怎麼來用代碼實現

import time
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

driver = Chrome()
driver.implicitly_wait(10)
driver.get("http://www.elong.com/")

input_ele = driver.find_element(By.XPATH, '//input[@data-bindid="city"]')
# -----組合鍵輸入
# ctrl+a 全選
input_ele.send_keys((Keys.CONTROL, 'a'))
time.sleep(2)
# ctrl+c 粘貼
input_ele.send_keys((Keys.CONTROL, 'c'))
time.sleep(2)
# ctrl+v 複製
input_ele.send_keys((Keys.CONTROL, 'v'))
input_ele.send_keys((Keys.CONTROL, 'v'))
input_ele.send_keys((Keys.CONTROL, 'v'))    # 運行結果的目的地輸入框顯示三個北京

time.sleep(10)
driver.quit()

四、JS腳本操作

在python代碼中,如何執行js代碼,比如用12306的購票網站來舉例,出發日期的選擇框,是可以輸入的,我們如何做到直接手動輸入日期?有這麼幾種方式

方式一:直接js代碼,不參任何參數,把console的js包起來直接在python中執行

"""
通過js代碼修改元素屬性

"""

import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

driver = Chrome()
driver.implicitly_wait(10)
driver.get("https://www.12306.cn/index/")

date_input = driver.find_element(By.XPATH, '//input[@id="train_date"]')
# -----selenium中執行js代碼-------
# 純粹的js代碼,不涉及到參數的傳遞
js = """
    ele = document.getElementById('train_date');
    ele.readOnly=false;
"""
# 執行js代碼,將日期的readOnly屬性改爲false
driver.execute_script(js)
time.sleep(2)
# 把默認的日期清空
date_input.clear()
# 輸入你要輸入的日期
date_input.send_keys("2021-06-17")

time.sleep(10)
driver.quit()

方式二:通過arguments用來接收參數

import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

driver = Chrome()
driver.implicitly_wait(10)
driver.get("https://www.12306.cn/index/")

date_input = driver.find_element(By.XPATH, '//input[@id="train_date"]')
# -----selenium中執行js代碼-------
# 往js代碼中傳參數,arguments是用來接收我們傳進去的參數,他是類似一個列表的一種數據類型們,可以通過下標獲取對應的參數值
js = """
  arguments[0].readOnly=false;
  console.log(arguments[0]);
  console.log(arguments[1]);
  console.log(arguments[2]);
"""

driver.execute_script(js, date_input, 11, 22)

time.sleep(2)
# 把默認的日期清空
date_input.clear()
# 輸入你要輸入的日期
date_input.send_keys("2021-06-17")

time.sleep(20)
driver.quit()

方式三:直接修改value屬性,不用再在外面傳輸入的日期內容

"""
通過js代碼修改value屬性

"""

import time
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By

driver = Chrome()
driver.implicitly_wait(10)
driver.get("https://www.12306.cn/index/")

date_input = driver.find_element(By.XPATH, '//input[@id="train_date"]')
# -----selenium中執行js代碼-------
js1 = """arguments[0].readOnly=false;"""
driver.execute_script(js1, date_input)
time.sleep(1)
js2 = """arguments[0].value = '2021-06-18';"""
driver.execute_script(js2, date_input)

time.sleep(20)
driver.quit()

因此,我們如果以後想通過js代碼來實現手動也是可以的,就拿12306網站來說,無論是出發日期還是出發地目的地都是可以修改,在實際項目中,可靈活根據需求應用

五、窗口滾動

點擊元素的時候,別忘了後邊的括號裏面傳元素

六、窗口管理

點擊元素的時候,別忘了後邊的括號裏面傳元素

七、文件上傳

點擊元素的時候,別忘了後邊的括號裏面傳元素

 

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