Selenium實戰(三)——滑動解鎖+窗口截圖


一、簡單滑塊的實例

當單機滑塊時,改變的只是CSS樣式,HTML代碼如下:

1 <div class="slide-to-unlock-progress" style="background-color: rgb(255, 233, 127); height: 36px;"></div>
2 <div class="slide-to-unlock-handle" style="background-color: rgb(255, 255, 255); height: 38px; line-height: 38px; width: 37px;"></div>

  slide-to-unlock-handle表示滑塊。在滑動過程中,滑塊的左邊距逐漸變大;slide-to-unlock-progress表示滑過之后的背景色,背景色的區域會逐漸增加。

 1 from selenium import webdriver
 2 from time import sleep
 3 
 4 from selenium.common.exceptions import UnexpectedAlertPresentException
 5 from selenium.webdriver import ActionChains
 6 
 7 driver = webdriver.Chrome()
 8 driver.maximize_window()
 9 
10 driver.get("https://www.helloweba.net/demo/2017/unlock/")
11 
12 # 定位滑塊
13 slider = driver.find_elements_by_class_name("slide-to-unlock-handle")[2]
14 action = ActionChains(driver)
15 action.click_and_hold(slider).perform()
16 
17 for index in range(200):
18     try:
19         action.move_by_offset(5, 0).perform()
20     except UnexpectedAlertPresentException:
21         break
22     action.reset_actions()
23     sleep(0.1)      # 等待停頓時間
24 
25 # 打印警告框提示
26 success_text = driver.switch_to.alert.text

 方法解讀:

  • click_and_hold():單擊並按下鼠標左鍵;
  • move_by_offset():移動鼠標,第一個參數為x坐標距離,第二個參數為y坐標距離;
  • reset_action():重置action.

 

1 # 獲取滑塊元素
2 sour = driver.find_element_by_id("***")
3 
4 # 獲取滑塊的滾動區域元素
5 ele = driver.find_element_by_name("***")
6 
7 # 拖動滑塊
8 ActionChains(driver).drag_and_drop_by_offset(sour,ele.size['width'],-sour.size['height']).perform()
二、上下滑動選擇日期

 

from selenium import webdriver
from time import sleep

driver = webdriver.Firefox()
driver.maximize_window()
driver.get("http://www.jq22.com/yanshi4976")
sleep(2)
driver.switch_to.frame("iframe")
driver.find_element_by_id("appDate").click()

# 定位要滑動的年、月、日
dwwos = driver.find_elements_by_class_name("dwwo")
year = dwwos[0]
month = dwwos[1]
day = dwwos[2]

action = webdriver.TouchActions(driver)
action.scroll_from_element(year, 0, 5).perform()
action.scroll_from_element(month, 0, 30).perform()
action.scroll_from_element(day, 0, 30).perform()

這里使用TouchActions類中的scroll_from_element()方法滑動元素。參數如下:

  •  on_element:滑動的元素
  • xoffset:x坐標距離
  • yoffset:y坐標距離

有遺留的問題沒解決:

找了試了各種方法(更新瀏覽器,重新選擇chromedriver都無果,枯了),終於終於可算是有了解決辦法了,參考網址:https://stackoverflow.com/questions/56111529/cannot-call-non-w3c-standard-command-while-in-w3c-mode-seleniumwebdrivererr,加了一段代碼,如下:

 1 from selenium import webdriver
 2 from time import sleep
 3 opt = webdriver.ChromeOptions()
 4 opt.add_experimental_option('w3c', False)
 5 driver = webdriver.Chrome(chrome_options=opt)
 6 driver.maximize_window()
 7 driver.get("http://www.jq22.com/yanshi4976")
 8 sleep(2)
 9 driver.switch_to.frame("iframe")
10 driver.find_element_by_id("appDate").click()
11 
12 # 定位要滑動的年、月、日
13 dwwos = driver.find_elements_by_class_name("dwwo")
14 year = dwwos[0]
15 month = dwwos[1]
16 day = dwwos[2]
17 
18 action = webdriver.TouchActions(driver)
19 action.scroll_from_element(year, 0, 5).perform()
20 action.scroll_from_element(month, 0, 30).perform()
21 action.scroll_from_element(day, 0, 30).perform()
22 
23 driver.find_element_by_xpath("/html/body/div[3]/div/div[2]/div[2]/div[3]/span[1]").click()

簡單理解了一下,大致是不符合w3c的標准,加一行禁用的代碼就可以了~愚人笨解哈哈哈哈哈,來放個結果圖:

三、窗口截圖

  WebDriver提供了截圖函數save_screenshut(),可用來截取當前窗口。WebDriver建議使用png作為圖片的后綴名。腳本運行完成后,會在當前files/目錄中生成baidu_img.png圖片。

1 from selenium import webdriver
2 driver = webdriver.Chrome()
3 driver.get("http://www.baidu.com")
4 
5 # 截取當前窗口,指定截圖圖片的保存位置
6 driver.save_screenshot("./files/baidu_img.png")

2.截取部分圖片

  這里要安裝一個pillow庫:pip install pillow

 1 def get_pictures(self):
 2     self.driver.get('http://10.98.0.224:5201/V4/index.html#/login')  # 打開登陸頁面
 3     self.driver.save_screenshot('pictures.png')  # 全屏截圖
 4     page_snap_obj = Image.open('pictures.png')
 5     img = self.driver.find_element_by_xpath("/html/body/div/div/div/div[3]/div/div[1]/ul/li[4]/img")  # 驗證碼元素位置
 6     time.sleep(1)
 7     location = img.location
 8     size = img.size  # 獲取驗證碼的大小參數
 9     left = location['x']
10     top = location['y']
11     right = left + size['width']
12     bottom = top + size['height']
13     image_obj = page_snap_obj.crop((left, top, right, bottom))  # 按照驗證碼的長寬,切割驗證碼
14     # image_obj.show()  # 打開切割后的完整驗證碼
15     self.driver.close()  # 處理完驗證碼后關閉瀏覽器
16     return image_obj

 


免責聲明!

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



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