1. 程式人生 > >模擬點選,滑鼠移動,拖拽,按鍵,下拉框的處理

模擬點選,滑鼠移動,拖拽,按鍵,下拉框的處理

1.模擬點選
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/clicks.htm')
click_btn = driver.find_element_by_xpath('//input[@value="click me"]') # 單擊按鈕
doubleclick_btn = driver.find_element_by_xpath('//input[@value="dbl click me"]') # 雙擊按鈕
rightclick_btn = driver.find_element_by_xpath('//input[@value="right click me"]') # 右鍵單擊按鈕
ActionChains(driver).click(click_btn).double_click(doubleclick_btn).context_click(rightclick_btn).perfor
m() # 鏈式用法
print(driver.find_element_by_name('t2').get_attribute('value'))
sleep(2)
driver.quit()
2.滑鼠移動
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/mouseover.htm')
write = driver.find_element_by_xpath('//input[@value="Write on hover"]') # 滑鼠移動到此元素,
在下面的 input 框中會顯示“Mouse moved”
blank = driver.find_element_by_xpath('//input[@value="Blank on hover"]') # 滑鼠移動到此元素,
會清空下面 input 框中的內容
result = driver.find_element_by_name('t1')
action = ActionChains(driver)
action.move_to_element(write).perform() # 移動到 write,顯示“Mouse moved”
print(result.get_attribute('value'))
# action.move_to_element(blank).perform()
action.move_by_offset(10, 50).perform() # 移動到距離當前位置(10,50)的點,與上句效果相同,
移動到 blank 上,清空
print(result.get_attribute('value'))
action.move_to_element_with_offset(blank, 10, -40).perform() # 移動到距離 blank 元素(10,-40)的
點,可移動到 write 上
print(result.get_attribute('value'))
sleep(2)
driver.quit()
3.拖拽
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/dragDropMooTools.htm')
dragger = driver.find_element_by_id('dragger') # 被拖拽元素
item1 = driver.find_element_by_xpath('//div[text()="Item 1"]') # 目標元素 1
item2 = driver.find_element_by_xpath('//div[text()="Item 2"]') # 目標 2
item3 = driver.find_element_by_xpath('//div[text()="Item 3"]') # 目標 3
item4 = driver.find_element_by_xpath('//div[text()="Item 4"]') # 目標 4
action = ActionChains(driver)
action.drag_and_drop(dragger, item1).perform() # 1.移動 dragger 到目標 1
sleep(2)
action.click_and_hold(dragger).release(item2).perform() # 2.效果與上句相同,也能起到移動效果
sleep(2)
action.click_and_hold(dragger).move_to_element(item3).release().perform() # 3.效果與上兩句相
同,也能起到移動的效果
sleep(2)
# action.drag_and_drop_by_offset(dragger, 400, 150).perform() # 4.移動到指定座標
action.click_and_hold(dragger).move_by_offset(400, 150).release().perform() # 5.與上一句相同,移
動到指定座標
sleep(2)
driver.quit()
4.按鍵
模擬按鍵有多種方法,能用 win32api 來實現,能用 SendKeys 來實現,也可以用 selenium 的
WebElement 物件的 send_keys()方法來實現,這裡 ActionChains 類也提供了幾個模擬按鍵的
方法。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
# 要想呼叫鍵盤按鍵操作需要引入 keys 包
from selenium.webdriver.common.keys import Keys
from time import sleep
driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.maximize_window()
driver.get('http://sahitest.com/demo/keypress.htm')
key_up_radio = driver.find_element_by_id('r1') # 監測按鍵升起
key_down_radio = driver.find_element_by_id('r2') # 監測按鍵按下
key_press_radio = driver.find_element_by_id('r3') # 監測按鍵按下升起
enter = driver.find_elements_by_xpath('//form[@name="f1"]/input')[1] # 輸入框
result = driver.find_elements_by_xpath('//form[@name="f1"]/input')[0] # 監測結果
# 監測 key_down
key_down_radio.click()
ActionChains(driver).key_down(Keys.CONTROL, enter).key_up(Keys.CONTROL).perform()
print(result.get_attribute('value'))
# 監測 key_up
key_up_radio.click()
enter.click()
ActionChains(driver).key_down(Keys.SHIFT).key_up(Keys.SHIFT).perform()
print(result.get_attribute('value'))
# 監測 key_press
key_press_radio.click()
enter.click()
ActionChains(driver).send_keys('a').perform()
print(result.get_attribute('value'))
driver.quit()
下拉框的處理
有時候我們會碰到<select> </select>標籤的下拉框。直接點選下拉框中的選項不一定可行。
Selenium 專門提供了 Select 類來處理下拉框完成這些事情
 Select 提供了三種選擇方法:
select_by_index(index) ——通過選項的順序,第一個為 0
select_by_value(value) ——通過 value 屬性
select_by_visible_text(text) ——通過選項可見文字
 全部取消選擇:
select.deselect_all()
 Select 提供了相應屬性,選擇了選項之後,檢視所選項
options ——提供所有的選項的列表,其中都是選項的 WebElement 元素
all_selected_options ——提供所有被選中的選項的列表,其中也均為選項的 WebElement 元素
first_selected_option ——提供第一個被選中的選項,也是下拉框的預設值
範例
from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver = webdriver.Chrome()
driver.get('http://sahitest.com/demo/selectTest.htm')
s1 = Select(driver.find_element_by_id('s1Id')) # 例項化 Select
s1.select_by_index(1) # 選擇第二項選項: o1
print(s1.first_selected_option.text)
s1.select_by_value("o2") # 選擇 value="o2"的項
print(s1.first_selected_option.text)
s1.select_by_visible_text("o3") # 選擇 text="o3"的值,即在下拉時我們可以看到的文字
print(s1.first_selected_option.text)
driver.quit()
彈窗處理
當你觸發了某個事件之後,頁面出現了彈窗提示,處理這個提示或者獲取提示資訊方法如下:
alert = driver.switch_to_alert()
用 switch_to_alert 先定位到彈窗,然後使用一系列方法來操作:
accept - 點選【確認】按鈕
dismiss - 點選【取消】按鈕(如有按鈕)
send_keys - 輸入內容(如有輸入框)
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.get("http://sahitest.com/demo/alertTest.htm")
driver.find_element_by_name("b1").click()
time.sleep(1)
al = driver.switch_to_alert()
time.sleep(1)
al.accept()
switch_to_alert()是舊寫法,新寫法應該是 switch_to.alert(),但是會報錯,猜測是版本問題。
頁面切換
一個瀏覽器肯定會有很多視窗,切換視窗的方法如下:
driver.switch_to.window("this is window name")
也可以使用 window_handles 方法來獲取每個視窗的操作物件。例如:
for handle in driver.window_handles:
driver.switch_to_window(handle)
python 之――――selenium

頁面前進和後退
操作頁面的前進和後退功能:
driver.forward() #前進
driver.back() # 後退
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.implicitly_wait(3) # seconds
first_url = 'http://www.baidu.com/'
driver.get(first_url)
print(driver.title) # 第一個頁面
driver.find_element_by_link_text("新聞").click()
driver.switch_to_window(driver.window_handles[0])
print(driver.title) # 第一個頁面
#browser.switch_to_window(browser.window_handles[1])
#browser.title # 最後一個頁面
time.sleep(2)
driver.back() # 從百度新聞後退到百度首頁
print(driver.title) # 第一個頁面
time.sleep(2)
driver.forward() # 百度首頁前進到百度新聞
print(driver.title) # 第一個頁面
time.sleep(2)
driver.quit()
視窗最大化
driver.maximize_window()