1. 程式人生 > >selenium+python自動化84-chrome手機wap模式(登入淘寶頁面)

selenium+python自動化84-chrome手機wap模式(登入淘寶頁面)

selenium+python自動化84-chrome手機wap模式(登入淘寶頁面)


轉載自: https://www.cnblogs.com/yoyoketang/p/7942275.html

前言

chrome手機wap模式登入淘寶頁面,點選驗證碼無效問題解決。
切換到wap模式,使用TouchActions模組用tap方法觸控

我的環境

  • chrome 62
  • chromedriver 2.33

遇到的問題

1.登入手機版淘寶時候,驗證碼無法通過點選事件觸發
[wap版淘寶](https://login.m.taobao.com/msg_login.htm?spm=0.0.0.0)
在這裡插入圖片描述

但是在F12 切換成手機模式後發現輸入手機號後,手動操作是可以觸發驗證碼的
在這裡插入圖片描述

Chrome手機模式

1.新增Options配置,設定成手機模式訪問

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

url = "https://login.m.taobao.com/msg_login.htm?spm=0.0.0.0"
mobile_emulation ={ #"deviceName": "Apple iPhone 3GS" #"deviceName": "Apple iPhone 4" #"deviceName": "Apple iPhone 5" #"deviceName": "Apple iPhone 6" #"deviceName": "Apple iPhone 6 Plus" #"deviceName": "BlackBerry Z10" #"deviceName": "BlackBerry Z30"
#"deviceName": "Google Nexus 4" #"deviceName": "Google Nexus 5" #"deviceName": "Google Nexus S" #"deviceName": "HTC Evo, Touch HD, Desire HD, Desire" #"deviceName": "HTC One X, EVO LTE" #"deviceName": "HTC Sensation, Evo 3D" #"deviceName": "LG Optimus 2X, Optimus 3D, Optimus Black" #"deviceName": "LG Optimus G" #"deviceName": "LG Optimus LTE, Optimus 4X HD" #"deviceName": "LG Optimus One" #"deviceName": "Motorola Defy, Droid, Droid X, Milestone" #"deviceName": "Motorola Droid 3, Droid 4, Droid Razr, Atrix 4G, Atrix 2" #"deviceName": "Motorola Droid Razr HD" #"deviceName": "Nokia C5, C6, C7, N97, N8, X7" #"deviceName": "Nokia Lumia 7X0, Lumia 8XX, Lumia 900, N800, N810, N900" #"deviceName": "Samsung Galaxy Note 3" #"deviceName": "Samsung Galaxy Note II" #"deviceName": "Samsung Galaxy Note" #"deviceName": "Samsung Galaxy S III, Galaxy Nexus" #"deviceName": "Samsung Galaxy S, S II, W" #"deviceName": "Samsung Galaxy S4" #"deviceName": "Sony Xperia S, Ion" #"deviceName": "Sony Xperia Sola, U" #"deviceName": "Sony Xperia Z, Z1" #"deviceName": "Amazon Kindle Fire HDX 7″" #"deviceName": "Amazon Kindle Fire HDX 8.9″" #"deviceName": "Amazon Kindle Fire (First Generation)" #"deviceName": "Apple iPad 1 / 2 / iPad Mini" #"deviceName": "Apple iPad 3 / 4" #"deviceName": "BlackBerry PlayBook" #"deviceName": "Google Nexus 10" #"deviceName": "Google Nexus 7 2" #"deviceName": "Google Nexus 7" #"deviceName": "Motorola Xoom, Xyboard" #"deviceName": "Samsung Galaxy Tab 7.7, 8.9, 10.1" #"deviceName": "Samsung Galaxy Tab" #"deviceName": "Notebook with touch" "deviceName": "iPhone 6" # Or specify a specific build using the following two arguments #"deviceMetrics": { "width": 360, "height": 640, "pixelRatio": 3.0 }, #"userAgent": "Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 5 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19" } options = Options() options.add_experimental_option("mobileEmulation", mobile_emulation) driver = webdriver.Chrome(chrome_options=options) driver.get(url)

2.這裡的deviceName點開裝置選項,選擇一個手機裝置名稱
在這裡插入圖片描述

TouchAction

1.這裡輸入手機號後,用click點‘獲取驗證碼’是無效的,這時候需要換個思維,用TouchActions裡面的tap觸控方式去觸發‘獲取驗證碼’按鈕

2.TouchAction裡面的幾個用法

class TouchAction(object):
    def __init__(self, driver=None):
        self._driver = driver
        self._actions = []

    def tap(self, element=None, x=None, y=None, count=1):
        模擬手指觸控式螢幕

    def press(self, el=None, x=None, y=None):
        短按:模擬手指按住一個元素,或者座標

    def long_press(self, el=None, x=None, y=None, duration=1000):
        長按:模擬按住一個元素,或者座標

    def wait(self, ms=0):
        按住元素後的等待時間

    def move_to(self, el=None, x=None, y=None):
        移動手指到另外一個元素,或者座標,注意這裡座標不是絕對座標,是偏移量
        
    def release(self):
        釋放手指

    def perform(self):
        執行前面的動作

參考程式碼

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.touch_actions import TouchActions
from selenium.webdriver.chrome.options import Options

url = "https://login.m.taobao.com/msg_login.htm?spm=0.0.0.0"

# 設定成手機模式
mobile_emulation = {"deviceName":"iPhone 6"}
options = Options()
options.add_experimental_option("mobileEmulation", mobile_emulation)
driver = webdriver.Chrome(chrome_options=options)

driver.get(url)

driver.find_element_by_id("username").send_keys("yoyoketang")

# 觸控事件
el = driver.find_element_by_id('getCheckcode')
TouchActions(driver).tap(el).perform()

TouchAction提供的其他方法:

double_tap(on_element)                                                #雙擊   
flick_element(on_element, xoffset, yoffset, speed)         #從元素開始以指定的速度移動
long_press(on_element)                                            #長按不釋放
move(xcoord, ycoord)                                                #移動到指定的位置
perform()                                                                    #執行鏈中的所有動作
release(xcoord, ycoord)                                             #在某個位置鬆開操作
scroll(xoffset, yoffset)                                                      #滾動到某個位置
scroll_from_element(on_element, xoffset, yoffset)         #從某元素開始滾動到某個位置
tap(on_element)                                                             #單擊
tap_and_hold(xcoord, ycoord)                                        #某點按住

附:

selenium touchAction官方文件:
https://seleniumhq.github.io/selenium/docs/api/py/webdriver/selenium.webdriver.common.touch_actions.html