精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

可以完成 Android UI 自動化的 Python 庫

新聞 Android 自動化
Android Uiautomator2 Python Wrapper 這是一個可以完成Android的UI自動化的python庫, 該項目還在火熱的開發中。

 [[217058]]

uiautomator2

Android Uiautomator2 Python Wrapper 這是一個可以完成Android的UI自動化的python庫。 該項目還在火熱的開發中

google提供的uiautomator庫功能做起安卓自動化來非常強大,唯獨有兩個缺點:1. 只能在手機上運行 2. 只能使用java語言。 所以為了能更簡單快捷的使用uiautomator,這個項目通過在手機上運行了一個http服務的方法,將uiautomator中的函數開放了出來。然后再將這些http接口,封裝成了python庫。這里要非常感謝 Xiaocong He ( @xiaocong ),他將這個想法實現了出來,uiautomator2這個項目則是對原有xiaocong的項目 uiautomator 進行了bug的修改,功能進行了加強。具體有以下

  • 修復uiautomator經常性退出的問題
  • 代碼進行了重構和精簡,方便維護
  • 增加了脫離數據線運行測試的功能
  • 通過 minicap 加快截圖速度

雖然我說的很簡單,但是實現起來用到了很多的技術和技巧,功能非常強,唯獨文檔有點少。哈哈

Installation

  1. Install python library

    # Since uiautomator2 is still developing, you have to add --pre to install development version
    pip install --pre uiautomator2
    
    # Or you can install from source
    git clone https://github.com/openatx/uiautomator2
    pip install -e uiautomator2

    Optional, used in screenshot()

    pip install pillow
  2. Push and install (apk, atx-agent, minicap, minitouch) to device

    電腦連接上一個手機或多個手機, 確保adb已經添加到環境變量中,執行下面的命令會自動安裝 uiautomator-apk 以及 atx-agent

    python -m uiautomator2 init

    安裝提示 success 即可

Usage 使用指南

下文中我們用 device_ip 這個變量來定義手機的IP,通常來說安裝完 atx-agent 的時候會自動提示你手機的IP是多少。

如果手機的WIFI跟電腦不是一個網段的,需要先通過數據線將手機連接到電腦上,使用命令 adb forward tcp:7912 tcp:7912 將手機上的服務端口7912轉發到PC上。這個時候連接地址使用 127.0.0.1 即可。

命令行使用

  • init: 初始化設備的atx-agent等

    Installation部分已經介紹過,這里就不寫了

  • install: 通過URL安裝應用

    $ python -m uiautomator2 install $device_ip https://example.org/some.apk
    MainThread: 15:37:55,731 downloading 80.4 kB / 770.6 kB
    MainThread: 15:37:56,763 installing 770.6 kB / 770.6 kB
    MainThread: 15:37:58,780 success installed 770.6 kB / 770.6 kB
  • clear-cache: 清空緩存

    $ python -m uiautomator2 clear-cache
  • app-stop-all : 停止所有應用

    $ python -m uiautomator2 app-stop-all $device_ip

QUICK START

Open python, input with the following code

There are two ways to connect to the device.

  1. Through WIFI (recommend) Suppose device IP is 10.0.0.1 and your PC is in the same network.
import uiautomator2 as u2

d = u2.connect('10.0.0.1') # same as call with u2.connect_wifi('10.0.0.1')
print(d.info)
  1. Through USB Suppose device serial is 123456f
import uiautomator2 as u2

d = u2.connect('123456f') # same as call with u2.connect_usb('123456f')
print(d.info)

If just call u2.connect() with no arguments, env-var ANDROID_DEVICE_IP will first check. if env-var is empty, connect_usb will be called. you need to make sure there is only one device connected with your computer.

一些常用但是不知道歸到什么類里的函數

先中文寫著了,國外大佬們先用Google Translate頂著

檢查并維持uiautomator處于運行狀態

d.healthcheck()

連接本地的設備

需要設備曾經使用 python -muiautomator2 init 初始化過

d = u2.connect_usb("{Your-Device-Serial}")

一定時間內,出現則點擊

10s內如果出現Skip則點擊

clicked = d(text='Skip').click_exists(timeout=10.0)

打開調試開關

用于開發者或有經驗的使用者定位問題

>>> d.debug = True
>>> d.info
12:32:47.182 $ curl -X POST -d '{"jsonrpc": "2.0", "id": "b80d3a488580be1f3e9cb3e926175310", "method": "deviceInfo", "params": {}}' 'http://127.0.0.1:54179/jsonrpc/0'
12:32:47.225 Response >>>
{"jsonrpc":"2.0","id":"b80d3a488580be1f3e9cb3e926175310","result":{"currentPackageName":"com.android.mms","displayHeight":1920,"displayRotation":0,"displaySizeDpX":360,"displaySizeDpY":640,"displayWidth":1080,"productName"
:"odin","screenOn":true,"sdkInt":25,"naturalOrientation":true}}
<<< END

Notes:In below examples, we use d represent the uiautomator2 connect object

Table of Contents

  • Retrive the device info
  • Key Event Actions of the device
  • Gesture interaction of the device
  • Screen Actions of the device
  • Child and sibling UI object
  • Get the selected ui object status and its information
  • Perform the click action on the seleted ui object
  • Gesture action for the specific ui object

TODO

Basic API Usages

This part show the normal actions of the device through some simple examples

Retrive the device info

d.info

Below is a possible result:

{ 
    u'displayRotation': 0,
    u'displaySizeDpY': 640,
    u'displaySizeDpX': 360,
    u'currentPackageName': u'com.android.launcher',
    u'productName': u'takju',
    u'displayWidth': 720,
    u'sdkInt': 18,
    u'displayHeight': 1184,
    u'naturalOrientation': True
}

Key Event Actions of the device

  • Tun on/off screen

    d.screen_on() # turn on screen
    d.screen_off() # turn off screen
  • Get screen on/off status

    d.info.get('screenOn') # require android >= 4.4
  • Press hard/soft key

    d.press("home") # press home key
    d.press("back") # the normal way to press back key
    d.press(0x07, 0x02) # press keycode 0x07('0') with META ALT(0x02)
  • Next keys are currently supported:

    • home
    • back
    • left
    • right
    • up
    • down
    • center
    • menu
    • search
    • enter
    • delete ( or del)
    • recent (recent apps)
    • volume_up
    • volume_down
    • volume_mute
    • camera
    • power

You can find all key code definitions at Android KeyEvnet

  • Unlock screen

    d.unlock()
    # 1. launch activity: com.github.uiautomator.ACTION_IDENTIFY
    # 2. press "home"

Gesture interaction of the device

  • Click the screen

    d.click(x, y)
  • Long click the screen

    d.long_click(x, y)
    d.long_click(x, y, 0.5) # long click 0.5s (default)
  • Swipe

    d.swipe(sx, sy, ex, ey)
    d.swipe(sx, sy, ex, ey, 0.5) # swipe for 0.5s(default)
  • Drag

    d.drag(sx, sy, ex, ey)
    d.drag(sx, sy, ex, ey, 0.5) # swipe for 0.5s(default)

Note: click, swipe, drag support percent position. Example:

d.long_click(0.5, 0.5) means long click center of screen

Screen Actions of the device

  • Retrieve/Set Orientation

    The possible orientation is:

    • natural or n
    • left or l
    • right or r
    • upsidedown or u (can not be set)
    # retrieve orientation, it may be "natural" or "left" or "right" or "upsidedown"
    orientation = d.orientation
    
    # WARNING: not pass testing in my TT-M1
    # set orientation and freeze rotation.
    # notes: "upsidedown" can not be set until Android 4.3.
    d.set_orientation('l') # or "left"
    d.set_orientation("l") # or "left"
    d.set_orientation("r") # or "right"
    d.set_orientation("n") # or "natural"
  • Freeze/Un-Freeze rotation

    # freeze rotation
    d.freeze_rotation()
    # un-freeze rotation
    d.freeze_rotation(False)
  • Take screenshot

    # take screenshot and save to local file "home.jpg", can not work until Android 4.2.
    d.screenshot("home.jpg")
    # get PIL.Image format, need install pillow first
    image = d.screenshot()
    image.save("home.jpg") # or home.png
    
    # get opencv format, need install numpy and cv2
    import cv2
    image = d.screenshot(format='opencv')
    cv2.imwrite('home.jpg', image)
  • Dump Window Hierarchy

    # or get the dumped content(unicode) from return.
    xml = d.dump_hierarchy()
  • Open notification or quick settings

    d.open_notification()
    d.open_quick_settings()

Push and pull file

  • push file into device

    # push into a folder
    d.push("foo.txt", "/sdcard/")
    # push and rename
    d.push("foo.txt", "/sdcard/bar.txt")
    # push fileobj
    with open("foo.txt", 'rb') as f:
        d.push(f, "/sdcard/")
    # push and change file mode
    d.push("foo.sh", "/data/local/tmp/", mode=0o755)
  • pull file from device

    d.pull("/sdcard/tmp.txt", "tmp.txt")
    
    # FileNotFoundError will raise if file not found in device
    d.pull("/sdcard/some-file-not-exists.txt", "tmp.txt")

App management

Include app install, launch and stop

App install

Only support install from url for now.

d.app_install('http://some-domain.com/some.apk')

App launch

d.app_start("com.example.hello_world") # start with package name

App stop

# perform am force-stop
d.app_stop("com.example.hello_world") 
# perform pm clear
d.app_clear('com.example.hello_world')

App stop all the runnings

# stop all
d.app_stop_all()
# stop all app except com.examples.demo
d.app_stop_all(excludes=['com.examples.demo'])

Selector

Selector is to identify specific ui object in current window.

# To seleted the object ,text is 'Clock' and its className is 'android.widget.TextView'
d(text='Clock', className='android.widget.TextView')

Selector supports below parameters. Refer to UiSelector java doc for detailed information.

  • text , textContains , textMatches , textStartsWith
  • className , classNameMatches
  • description , descriptionContains , descriptionMatches , descriptionStartsWith
  • checkable , checked , clickable , longClickable
  • scrollable , enabled , focusable , focused , selected
  • packageName , packageNameMatches
  • resourceId , resourceIdMatches
  • index , instance

Child and sibling UI object

  • child

    # get the child or grandchild
    d(className="android.widget.ListView").child(text="Bluetooth")
  • sibling

    # get sibling or child of sibling
    d(text="Google").sibling(className="android.widget.ImageView")
  • child by text or description or instance

    # get the child match className="android.widget.LinearLayout"
    # and also it or its child or grandchild contains text "Bluetooth"
    d(className="android.widget.ListView", resourceId="android:id/list") \
     .child_by_text("Bluetooth", className="android.widget.LinearLayout")
    
    # allow scroll search to get the child
    d(className="android.widget.ListView", resourceId="android:id/list") \
     .child_by_text(
        "Bluetooth",
        allow_scroll_search=True,
        className="android.widget.LinearLayout"
      )
    • child_by_description is to find child which or which's grandchild contains the specified description, others are the same as child_by_text .

    • child_by_instance is to find child which has a child UI element anywhere within its sub hierarchy that is at the instance specified. It is performed on visible views without scrolling.

    See below links for detailed information:

    • UiScrollable , getChildByDescription , getChildByText , getChildByInstance
    • UiCollection , getChildByDescription , getChildByText , getChildByInstance

    Above methods support chained invoking, e.g. for below hierarchy

    <node index="0" text="" resource-id="android:id/list" class="android.widget.ListView" ...>
      <node index="0" text="WIRELESS & NETWORKS" resource-id="" class="android.widget.TextView" .../>
      <node index="1" text="" resource-id="" class="android.widget.LinearLayout" ...>
        <node index="1" text="" resource-id="" class="android.widget.RelativeLayout" ...>
          <node index="0" text="Wi‑Fi" resource-id="android:id/title" class="android.widget.TextView" .../>
        </node>
        <node index="2" text="ON" resource-id="com.android.settings:id/switchWidget" class="android.widget.Switch" .../>
      </node>
      ...
    </node>

    We want to click the switch at the right side of text 'Wi‑Fi' to turn on/of Wi‑Fi. As there are several switches with almost the same properties, so we can not use like d(className="android.widget.Switch") to select the ui object. Instead, we can use code below to select it.

    d(className="android.widget.ListView", resourceId="android:id/list") \
      .child_by_text("Wi‑Fi", className="android.widget.LinearLayout") \
      .child(className="android.widget.Switch") \
      .click()
  • relative position

    Also we can use the relative position methods to get the view: left , right , top , bottom.

    • d(A).left(B) , means selecting B on the left side of A.
    • d(A).right(B) , means selecting B on the right side of A.
    • d(A).up(B) , means selecting B above A.
    • d(A).down(B) , means selecting B under A.

    So for above case, we can write code alternatively:

    ## select "switch" on the right side of "Wi‑Fi"
    d(text="Wi‑Fi").right(className="android.widget.Switch").click()
  • Multiple instances

    Sometimes the screen may contain multiple views with the same e.g. text, then you will have to use "instance" properties in selector like below:

    d(text="Add new", instance=0)  # which means the first instance with text "Add new"

    However, uiautomator provides list like methods to use it.

    # get the count of views with text "Add new" on current screen
    d(text="Add new").count
    
    # same as count property
    len(d(text="Add new"))
    
    # get the instance via index
    d(text="Add new")[0]
    d(text="Add new")[1]
    ...
    
    # iterator
    for view in d(text="Add new"):
        view.info  # ...

    Notes: when you are using selector like a list, you must make sure the screen keep unchanged, else you may get ui not found error.

Get the selected ui object status and its information

  • Check if the specific ui object exists

    d(text="Settings").exists # True if exists, else False
    d.exists(text="Settings") # alias of above property.
  • Retrieve the info of the specific ui object

    d(text="Settings").info

    Below is a possible result:

    { u'contentDescription': u'',
    u'checked': False,
    u'scrollable': False,
    u'text': u'Settings',
    u'packageName': u'com.android.launcher',
    u'selected': False,
    u'enabled': True,
    u'bounds': {u'top': 385,
                u'right': 360,
                u'bottom': 585,
                u'left': 200},
    u'className': u'android.widget.TextView',
    u'focused': False,
    u'focusable': True,
    u'clickable': True,
    u'chileCount': 0,
    u'longClickable': True,
    u'visibleBounds': {u'top': 385,
                        u'right': 360,
                        u'bottom': 585,
                        u'left': 200},
    u'checkable': False
    }
  • Set/Clear text of editable field

    d(text="Settings").clear_text()  # clear the text
    d(text="Settings").set_text("My text...")  # set the text

Perform the click action on the seleted ui object

  • Perform click on the specific ui object

    # click on the center of the specific ui object
    d(text="Settings").click()
    # wait element show for 10 seconds(Default)
    d(text="Settings").click(timeout=10)
    # alias of click
    # short name for quick type with keyboard
    d(text="Settings").tap()
    # wait element show for 0 seconds
    d(text="Settings").tap_nowait()
  • Perform long click on the specific ui object

    # long click on the center of the specific ui object
    d(text="Settings").long_click()

Gesture action for the specific ui object

  • Drag the ui object to another point or ui object

    # notes : drag can not be set until Android 4.3.
    # drag the ui object to point (x, y)
    d(text="Settings").drag_to(x, y, duration=0.5)
    # drag the ui object to another ui object(center)
    d(text="Settings").drag_to(text="Clock", duration=0.25)
  • Two point gesture from one point to another

    d(text="Settings").gesture((sx1, sy1), (sx2, sy2), (ex1, ey1), (ex2, ey2))
  • Two point gesture on the specific ui object

    Supports two gestures:

    • In , from edge to center
    • Out , from center to edge
    # notes : pinch can not be set until Android 4.3.
    # from edge to center. here is "In" not "in"
    d(text="Settings").pinch_in(percent=100, steps=10)
    # from center to edge
    d(text="Settings").pinch_out()
  • Wait until the specific ui appears or gone

    # wait until the ui object appears
    d(text="Settings").wait(timeout=3.0) # return bool
    # wait until the ui object gone
    d(text="Settings").wait_gone(timeout=1.0)

    Default timeout is 20s. see global settings for more details

  • Perform fling on the specific ui object(scrollable)

    Possible properties:

    • horiz or vert
    • forward or backward or toBeginning or toEnd
    # fling forward(default) vertically(default) 
    d(scrollable=True).fling()
    # fling forward horizentally
    d(scrollable=True).fling.horiz.forward()
    # fling backward vertically
    d(scrollable=True).fling.vert.backward()
    # fling to beginning horizentally
    d(scrollable=True).fling.horiz.toBeginning(max_swipes=1000)
    # fling to end vertically
    d(scrollable=True).fling.toEnd()
  • Perform scroll on the specific ui object(scrollable)

    Possible properties:

    • horiz or vert
    • forward or backward or toBeginning or toEnd , or to
    # scroll forward(default) vertically(default)
    d(scrollable=True).scroll(steps=10)
    # scroll forward horizentally
    d(scrollable=True).scroll.horiz.forward(steps=100)
    # scroll backward vertically
    d(scrollable=True).scroll.vert.backward()
    # scroll to beginning horizentally
    d(scrollable=True).scroll.horiz.toBeginning(steps=100, max_swipes=1000)
    # scroll to end vertically
    d(scrollable=True).scroll.toEnd()
    # scroll forward vertically until specific ui object appears
    d(scrollable=True).scroll.to(text="Security")

Watcher

You can register watcher to perform some actions when a selector can not find a match.

  • Register Watcher

    When a selector can not find a match, uiautomator will run all registered watchers.

    • Click target when conditions match
    d.watcher("AUTO_FC_WHEN_ANR").when(text="ANR").when(text="Wait") \
                                 .click(text="Force Close")
    # d.watcher(name) ## creates a new named watcher.
    #  .when(condition)  ## the UiSelector condition of the watcher.
    #  .click(target)  ## perform click action on the target UiSelector.
    • Press key when conditions match
    d.watcher("AUTO_FC_WHEN_ANR").when(text="ANR").when(text="Wait") \
                                 .press("back", "home")
    # d.watcher(name) ## creates a new named watcher.
    #  .when(condition)  ## the UiSelector condition of the watcher.
    #  .press(<keyname>, ..., <keyname>.()  ## press keys one by one in sequence.
  • Check if the named watcher triggered

    A watcher is triggered, which means the watcher was run and all its conditions matched.

    d.watcher("watcher_name").triggered
    # true in case of the specified watcher triggered, else false
  • Remove named watcher

    # remove the watcher
    d.watcher("watcher_name").remove()
  • List all watchers

    d.watchers
    # a list of all registered wachers' names
  • Check if there is any watcher triggered

    d.watchers.triggered
    #  true in case of any watcher triggered
  • Reset all triggered watchers

    # reset all triggered watchers, after that, d.watchers.triggered will be false.
    d.watchers.reset()
  • Remvoe watchers

    # remove all registered watchers
    d.watchers.remove()
    # remove the named watcher, same as d.watcher("watcher_name").remove()
    d.watchers.remove("watcher_name")
  • Force to run all watchers

    # force to run all registered watchers
    d.watchers.run()

另外文檔還是有很多沒有寫,推薦直接去看源碼 init .py

Global settings

# set delay 1.5s after each UI click and click
d.click_post_delay = 1.5 # default no delay

# set default element wait timeout (seconds)
d.wait_timeout = 30.0 # default 20.0

中文字符的輸入

這種方法通常用于不知道控件的情況下的輸入。第一步需要切換輸入法,然后發送adb廣播命令,具體使用方法如下

d.set_fastinput_ime(True) # 切換成FastInputIME輸入法
d.send_keys("你好123abcEFG") # adb廣播輸入
d.set_fastinput_ime(False) # 切換成正常的輸入法

測試方法

$ adb forward tcp:9008 tcp:9008
$ curl 127.0.0.1:9008/ping
# expect: pong

$ curl -d '{"jsonrpc":"2.0","method":"deviceInfo","id":1}' 127.0.0.1:9008/jsonrpc/0
# expect JSON output

Uiautomator與Uiautomator2的區別

  1. api不同但也差不多
  2. Uiautomator2是安卓項目,而Uiautomator是java項目
  3. Uiautomator2可以輸入中文,而Uiautomator的java工程需借助utf7輸入法才能輸入中文
  4. Uiautomator2必須明確EditText框才能向里面輸入文字,Uiautomator直接指定父類也可以在子類中輸入文字
  5. Uiautomator2獲取控件速度快寫,而Uiautomator獲取速度慢一些;

常見問題

  1. 提示 502 錯誤

    嘗試手機連接PC,然后運行下面的命令

    adb shell am instrument -w -r  -e debug false -e class com.github.uiautomator.stub.Stub \
    	com.github.uiautomator.test/android.support.test.runner.AndroidJUnitRunner

    如果運行正常,啟動測試之前增加一行代碼 d.healthcheck()

    如果報錯,可能是缺少某個apk沒有安裝,使用下面的命令重新初始化 python -m uiautomator2 init --reinstall

嘗鮮功能

手機 python -muiautomator2 init 之后,瀏覽器輸入 <手機IP:7912>,會發現一個遠程控制功能,延遲非常低噢。^_^

ABOUT

項目重構自 https://github.com/openatx/atx-uiautomator

CHANGELOG

Auto generated by pbr: CHANGELOG

依賴項目

Contributors

Others contributors

LICENSE

Under MIT

責任編輯:張燕妮 來源: 推酷
相關推薦

2025-11-10 09:14:26

PythonExcel自動化

2025-04-23 08:15:00

2020-08-03 15:40:57

Web自動化工具測試

2009-12-23 16:19:25

WPF UI自動化技術

2009-12-23 16:33:34

WPF UI自動化測試

2012-05-08 16:40:36

Android

2022-09-22 07:00:31

PC手機存儲

2009-12-23 16:27:49

WPF UI自動化模型

2013-05-16 10:58:44

Android開發自動化測試

2021-09-29 11:15:56

PyAutoGUIPython鍵鼠操作

2021-12-01 10:17:49

智能自動化遠程工作CIO

2022-01-27 13:23:15

Linux技巧命令

2021-03-09 10:08:15

Linux 自動化操作系統

2022-07-25 11:25:42

Linux自動化技巧

2017-12-17 21:58:18

2024-05-21 09:52:19

2022-02-18 13:12:49

人工智能自動化技術

2022-02-17 17:37:17

超級自動化人工智能AI

2020-04-29 11:28:54

智能自動化機器人流程自動化AI

2010-12-06 09:59:58

點贊
收藏

51CTO技術棧公眾號

免费电影一区二区三区| 污污片在线免费视频| 日本成人在线不卡视频| www.日韩av.com| 一区二区三区人妻| av在线视屏| 国产精品美女一区二区在线观看| 亚洲一区二区免费| 99精品在线播放| 五月精品视频| 日韩乱码在线视频| 一区二区三区国产好的精华液| 成人一级福利| 国产精品家庭影院| 久久久久成人精品免费播放动漫| 中文无码精品一区二区三区| 女人香蕉久久**毛片精品| 亚洲精品视频免费在线观看| 亚洲欧美日本一区二区| 中文字幕21页在线看| 亚洲欧美日韩精品久久久久| 欧美精品人人做人人爱视频| 99热这里只有精品99| 丝袜亚洲另类欧美综合| 久久久在线观看| 永久免费未视频| 免费观看久久av| 337p日本欧洲亚洲大胆精品| 91日韩精品视频| 欧美xx视频| 亚洲国产中文字幕在线视频综合| 亚洲电影网站| 国产在线一在线二| 91在线视频免费91| 国产精品18毛片一区二区| 国产乱淫av免费| 日韩成人dvd| 日本午夜在线亚洲.国产| 国产一级在线播放| 欧美日韩亚洲一区在线观看| xxxx性欧美| 91无套直看片红桃在线观看| 要久久爱电视剧全集完整观看| 亚洲成人三级在线| 国产精品99久久久精品无码| 在线不卡一区| 6080国产精品一区二区| 久热精品在线观看视频| 蜜桃视频成人m3u8| 日本黄色一区二区| 久久精品网站视频| 我爱我色成人网| 色综合天天综合网天天狠天天| 国产69精品久久久久久久| 欧美aaa免费| 亚洲午夜久久久久中文字幕久| 久久国产精品免费观看| h片在线播放| 亚洲欧美偷拍卡通变态| 日韩精品第1页| 91高清在线观看视频| 一区二区在线免费观看| 成人一级生活片| a级片在线免费观看| 亚洲成人在线网站| 国产淫片免费看| 日韩高清中文字幕一区二区| 欧美写真视频网站| а 天堂 在线| 成人爽a毛片免费啪啪红桃视频| 欧美成人video| 国产视频久久久久久| 婷婷综合电影| 中文字幕精品www乱入免费视频| 日韩免费成人av| 99热在线成人| 欧美激情按摩在线| 中文字字幕在线中文| 久久激情婷婷| 成人av番号网| 丰满少妇高潮在线观看| www国产精品av| 亚洲欧美日产图| 日本在线观看高清完整版| 亚洲成精国产精品女| 日本一本二本在线观看| 日本精品久久| 亚洲精品v欧美精品v日韩精品| 受虐m奴xxx在线观看| 色男人天堂综合再现| 久久99亚洲精品| 亚洲不卡在线视频| 国产一二精品视频| 欧美不卡在线一区二区三区| 免费观看在线午夜影视| 亚洲大片免费看| 色综合天天色综合| theporn国产在线精品| 亚洲一区二区福利| 欧美激情图片小说| 嫩草成人www欧美| 91亚色免费| 精品无吗乱吗av国产爱色| 亚洲视频在线一区二区| 超碰97人人射妻| 精品成人18| 亚洲社区在线观看| 久久久久亚洲av无码专区| 日韩福利电影在线| 国内成+人亚洲| 免费在线看黄| 日韩欧美一区二区在线| 韩国三级在线播放| 青青草国产成人a∨下载安卓| 久久久久久久久久久免费| 在线免费观看日韩视频| 91免费观看在线| 99久久99久久精品| 美女视频一区| 亚洲午夜未满十八勿入免费观看全集| 日韩精品成人一区| 国产美女娇喘av呻吟久久| 日韩影片在线播放| 性欧美18xxxhd| 亚洲精品一区二区三区精华液| 国产激情av在线| 久久精品五月| 精品一区二区日本| 女人天堂av在线播放| 制服丝袜中文字幕一区| 337人体粉嫩噜噜噜| 久久久久国产精品午夜一区| 国产欧美一区二区视频| 亚洲精品天堂| 欧美一级国产精品| 色哟哟一一国产精品| 美女视频一区二区| 翔田千里亚洲一二三区| 欧美黄色三级| 亚洲人成网站999久久久综合| 欧美三级韩国三级日本三斤在线观看| 国产黄色成人av| 福利网在线观看| 色综合视频一区二区三区日韩 | 国产区亚洲区欧美区| 男人的天堂在线| 色婷婷激情久久| wwwwxxxx国产| 久久久成人网| 日韩一区二区电影在线观看| 高清av一区二区三区| 这里只有精品久久| 亚洲一二区视频| 国产精品久久午夜夜伦鲁鲁| 亚洲视频第二页| 99国产精品一区二区| 成人欧美一区二区三区黑人| 黄色网在线免费观看| 欧美一区二区三区成人| 青娱乐在线视频免费观看| 国产成人av福利| 欧美乱做爰xxxⅹ久久久| 国产乱论精品| 欧美在线激情视频| 毛片在线播放网站| 欧美精品久久一区二区三区| 综合五月激情网| 成人永久免费视频| 欧美精品99久久| 国产一区网站| 91老司机在线| 9999在线视频| 亚洲天堂男人天堂| 91亚洲国产成人精品一区| 亚洲另类在线一区| 精品人妻一区二区免费视频| 久久午夜影视| 国产又大又长又粗又黄| 国产精品videossex| 日韩av色在线| av中文字幕在线观看| 亚洲福利小视频| 中文在线a天堂| 亚洲国产精品一区二区www| 亚洲中文字幕无码av| 日韩av不卡在线观看| 国产精品久久成人免费观看| 国产精品1luya在线播放| 国产精品久久久久久av福利软件| 黄色片网站在线| 日韩毛片中文字幕| 国产精品无码免费播放| 亚洲.国产.中文慕字在线| 午夜精产品一区二区在线观看的| 国产自产v一区二区三区c| 欧美三级在线观看视频| 久久国产精品亚洲人一区二区三区| 成人免费看片网址| 国产成人精品一区二三区在线观看 | 欧美三日本三级三级在线播放| 中文字幕av免费在线观看| 91在线porny国产在线看| 色啦啦av综合| 亚洲一区亚洲| 国产欧美久久久久| 欧美三级三级| 精品婷婷色一区二区三区蜜桃| 亚洲欧美久久精品| 欧美性视频精品| 亚洲婷婷噜噜| 日韩视频免费大全中文字幕| 青草久久伊人| 精品第一国产综合精品aⅴ| 在线观看免费视频a| 日韩欧美成人精品| 九九热国产精品视频| 国产精品亲子伦对白| 欧美 变态 另类 人妖| 国产91富婆露脸刺激对白| 国产精品视频黄色| 午夜在线观看免费一区| 日韩成人手机在线| 影视亚洲一区二区三区| 日韩中文字幕一区二区| 亚洲欧洲美洲国产香蕉| 国产精品一区二区你懂得| 99精品在线免费观看| 国产精品免费一区| 蜜桃精品在线| 国产999视频| 在线人成日本视频| 性欧美在线看片a免费观看| 中文在线字幕免费观看| 日韩在线观看免费高清| av免费观看一区二区| 亚洲天堂一区二区三区| 神马久久久久| 精品国产髙清在线看国产毛片| 国产黄频在线观看| 日韩午夜激情视频| av中文字幕免费| 日韩一区二区高清| 亚洲不卡免费视频| 欧美r级在线观看| а√天堂资源在线| 日韩美女天天操| 亚洲毛片欧洲毛片国产一品色| 日韩一级片网站| 不卡的日韩av| 精品国产露脸精彩对白| 天天操天天射天天舔| 日韩经典中文字幕| 毛片在线播放网站| 尤物九九久久国产精品的分类| 成人18在线| 色爱av美腿丝袜综合粉嫩av| 免费**毛片在线| 欧美成人一区在线| 国产99re66在线视频| 97香蕉超级碰碰久久免费软件| 天堂av在线| 国产精品精品视频| 91成人在线网站| 丁香婷婷久久久综合精品国产| 久久动漫网址| 日本高清一区| 无码一区二区三区视频| 成人av在线播放观看| 国产日韩综合| 国产av人人夜夜澡人人爽| 紧缚奴在线一区二区三区| 无人码人妻一区二区三区免费| 成人高清视频在线观看| wwwwww日本| 日韩理论片网站| 国产网站在线看| 色婷婷亚洲综合| 国产精品久久久久久免费播放| 精品日韩在线观看| 黄色片在线免费观看| 久久香蕉国产线看观看av| 成人福利影视| 国产精品网站入口| 伊色综合久久之综合久久| 久久久久久九九九九| 欧美电影《睫毛膏》| 男人添女人下部高潮视频在观看| 久久夜色精品| 亚洲成人福利视频| 国产亚洲一区二区三区| 国产精品久久久精品四季影院| 欧美日韩人人澡狠狠躁视频| 亚洲系列第一页| 日韩av在线电影网| huan性巨大欧美| 国产精品国产三级国产aⅴ9色| 亚洲日本一区二区三区在线| 热re99久久精品国99热蜜月| 欧美精品一卡| 亚洲欧美久久久久| 91亚洲国产成人精品一区二三| 男人晚上看的视频| 一本久久a久久免费精品不卡| 成人黄色免费视频| 色琪琪综合男人的天堂aⅴ视频| 国产美女高潮在线| 91网站免费看| 欧美三级伦理在线| 波多野结衣乳巨码无在线| 国产一区二区日韩精品| 日本成人午夜影院| 欧美日韩国产中文字幕| aaa一区二区三区| 中文字幕亚洲一区二区三区五十路| 成人免费观看在线观看| 91精品久久久久久蜜桃| 日韩精品不卡一区二区| 国产成人久久婷婷精品流白浆| 成人免费看的视频| 成人免费视频网站入口::| 欧美日韩中文字幕一区| 你懂的在线视频| 午夜精品免费视频| av成人男女| 亚洲色婷婷久久精品av蜜桃| 精品一区二区三区蜜桃| 91资源在线播放| 欧美性一区二区| 黄色在线视频观看网站| 57pao成人永久免费视频| 精品国产影院| 九色自拍视频在线观看| 成人精品视频.| 久久精品国产亚洲av无码娇色| 日韩一级完整毛片| 久色国产在线| 超碰97在线资源| 韩国欧美一区| 久久久久亚洲av无码网站| 亚洲激情网站免费观看| 国产wwwwwww| 久久6精品影院| 日本少妇精品亚洲第一区| 四虎精品欧美一区二区免费| 国产一区二区91| 美女视频黄免费| 亚洲精品一线二线三线无人区| 性欧美videoshd高清| 国产高清在线一区| 国产午夜精品一区二区三区欧美 | 少妇av在线播放| 午夜精品久久久久久久白皮肤 | 国产精品亚洲一区二区三区在线 | 国产精品久久久免费| 超碰97人人干| 欧洲另类一二三四区| 91美女视频在线| 亚洲影视九九影院在线观看| 欧美大片专区| 欧美熟妇精品一区二区蜜桃视频| 午夜精品视频一区| 国内在线免费高清视频| 国产精品入口福利| 亚洲精品成人| 亚洲乱妇老熟女爽到高潮的片| 亚洲第一成人在线| 国产小视频免费在线观看| 国产精品视频在线播放| 一区二区国产在线| 欧美一区二区免费在线观看| 色偷偷一区二区三区| 日本www在线| 国产精品乱码一区二区三区| 久久不射网站| 欧美a级片免费看| 亚洲第一二三四五区| 在线看欧美视频| 精品一区二区成人免费视频| 成人精品电影在线观看| 樱花视频在线免费观看| 久久色精品视频| 牛牛精品成人免费视频| 五月婷婷狠狠操| 一区二区三区不卡视频在线观看| 亚洲 另类 春色 国产| 国产精品入口福利| 亚洲成人资源| 精品一区二区三孕妇视频| 欧美变态tickle挠乳网站| 欧美va视频| 97免费视频观看| 中文在线一区二区| 日本黄色一区二区三区| 91精品久久久久久久久久入口| 亚洲日本欧美| 永久免费看片直接| 亚洲欧美日韩一区二区三区在线| 国内精品视频| 狠狠热免费视频| 欧美日韩国产区|