今天接着講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網站來說,無論是出發日期還是出發地目的地都是可以修改,在實際項目中,可靈活根據需求應用
五、窗口滾動
點擊元素的時候,別忘了後邊的括號裏面傳元素
六、窗口管理
點擊元素的時候,別忘了後邊的括號裏面傳元素
七、文件上傳
點擊元素的時候,別忘了後邊的括號裏面傳元素