Appium Appium Python API 中文版 By-HZJ

huan · 2015年12月01日 · 最后由 11 回复于 2021年03月11日 · 23797 次阅读
本帖已被设为精华帖!

根据 appium 1.4.13.1 版本整理,1.5 弃用了 find by name 所以更新了下
如有错误请多多指正
谢谢@lylyliuyu @chenhengjie123 的补充和指正
Appium_Python_Api 文档

1.contexts
contexts(self):

    Returns the contexts within the current session.
    返回当前会话中的上下文使用后可以识别H5页面的控件

    :Usage:
        driver.contexts
用法 driver.contexts

2. current_context
current_context(self):

    Returns the current context of the current session.
    返回当前会话的当前上下文
    :Usage:
        driver.current_context
用法driver. current_context

3. context
context(self):

    Returns the current context of the current session.
    返回当前会话的当前上下文
    :Usage:
        driver.context
用法driver. Context

4. find_element_by_ios_uiautomation
find_element_by_ios_uiautomation(self, uia_string):

Finds an element by uiautomation in iOS.
    通过iOS uiautomation查找元素
    :Args:
     - uia_string - The element name in the iOS UIAutomation library

    :Usage:
        driver.find_element_by_ios_uiautomation('.elements()[1].cells()[2]')
用法dr. find_element_by_ios_uiautomation(elements)

5. find_element_by_accessibility_id
find_element_by_accessibility_id(self, id):

Finds an element by accessibility id.
    通过accessibility id查找元素
    :Args:
     - id - a string corresponding to a recursive element search using the
     Id/Name that the native Accessibility options utilize

    :Usage:
        driver.find_element_by_accessibility_id()
用法driver.find_element_by_accessibility_id(id)

6.scroll
scroll(self, origin_el, destination_el):

Scrolls from one element to another
    从元素origin_el滚动至元素destination_el
    :Args:
     - originalEl - the element from which to being scrolling
     - destinationEl - the element to scroll to

    :Usage:
        driver.scroll(el1, el2)
用法 driver.scroll(el1,el2)

7. drag_and_drop
drag_and_drop(self, origin_el, destination_el):

Drag the origin element to the destination element
    将元素origin_el拖到目标元素destination_el
    :Args:
     - originEl - the element to drag
     - destinationEl - the element to drag to
用法 driver.drag_and_drop(el1,el2)

8.tap
tap(self, positions, duration=None):

Taps on an particular place with up to five fingers, holding for a certain time
模拟手指点击最多五个手指),可设置按住时间长度毫秒

    :Args:
     - positions - an array of tuples representing the x/y coordinates of
     the fingers to tap. Length can be up to five.
     - duration - (optional) length of time to tap, in ms

    :Usage:
        driver.tap([(100, 20), (100, 60), (100, 100)], 500)
用法 driver.tap([(x,y),(x1,y1)],500)

9. swipe
swipe(self, start_x, start_y, end_x, end_y, duration=None):

Swipe from one point to another point, for an optional duration.
    从A点滑动至B点滑动时间为毫秒
    :Args:
     - start_x - x-coordinate at which to start
     - start_y - y-coordinate at which to start
     - end_x - x-coordinate at which to stop
     - end_y - y-coordinate at which to stop
     - duration - (optional) time to take the swipe, in ms.

    :Usage:
        driver.swipe(100, 100, 100, 400)
用法 driver.swipe(x1,y1,x2,y2,500)

10.flick
flick(self, start_x, start_y, end_x, end_y):

Flick from one point to another point.
    按住A点后快速滑动至B点
    :Args:
     - start_x - x-coordinate at which to start
     - start_y - y-coordinate at which to start
     - end_x - x-coordinate at which to stop
     - end_y - y-coordinate at which to stop

    :Usage:
        driver.flick(100, 100, 100, 400)

用法 driver.flick(x1,y1,x2,y2)
11.pinch
pinch(self, element=None, percent=200, steps=50):

Pinch on an element a certain amount
    在元素上执行模拟双指捏缩小操作
    :Args:
     - element - the element to pinch
     - percent - (optional) amount to pinch. Defaults to 200%
     - steps - (optional) number of steps in the pinch action

    :Usage:
        driver.pinch(element)

用法 driver.pinch(element)
12.zoom
zoom(self, element=None, percent=200, steps=50):

Zooms in on an element a certain amount
    在元素上执行放大操作
    :Args:
     - element - the element to zoom
     - percent - (optional) amount to zoom. Defaults to 200%
     - steps - (optional) number of steps in the zoom action

    :Usage:
        driver.zoom(element)

用法 driver.zoom(element)
13.reset
reset(self):

Resets the current application on the device.
重置应用(类似删除应用数据)
用法 driver.reset()

14. hide_keyboard
hide_keyboard(self, key_name=None, key=None, strategy=None):

Hides the software keyboard on the device. In iOS, use `key_name` to press a particular key, or `strategy`. In Android, no parameters are used.
    隐藏键盘,iOS使用key_name隐藏安卓不使用参数

    :Args:
     - key_name - key to press
     - strategy - strategy for closing the keyboard (e.g., `tapOutside`)
driver.hide_keyboard()

15. keyevent
keyevent(self, keycode, metastate=None):

Sends a keycode to the device. Android only. Possible keycodes can be found in http://developer.android.com/reference/android/view/KeyEvent.html.
    发送按键码安卓仅有),按键码可以上网址中找到
    :Args:
     - keycode - the keycode to be sent to the device
     - metastate - meta information about the keycode being sent
用法 dr.keyevent(4)

16. press_keycode
press_keycode(self, keycode, metastate=None):

Sends a keycode to the device. Android only. Possible keycodes can be found in http://developer.android.com/reference/android/view/KeyEvent.html.
    发送按键码安卓仅有),按键码可以上网址中找到

    :Args:
     - keycode - the keycode to be sent to the device
     - metastate - meta information about the keycode being sent
用法 driver.press_ keycode(4)

dr.keyevent(‘4’) 与 driver.press_ keycode(‘4’) 功能实现上一样的,都是按了返回键
17. long_press_keycode
long_press_keycode(self, keycode, metastate=None):

Sends a long press of keycode to the device. Android only. Possible keycodes can be
    found in http://developer.android.com/reference/android/view/KeyEvent.html.
    发送一个长按的按键码长按某键
   详细的按键代码见这里  http://developer.android.com/reference/android/view/KeyEvent.html.

    :Args:
     - keycode - the keycode to be sent to the device
     - metastate - meta information about the keycode being sent
 用法 driver.long_press_keycode(4)  谢谢@user3童鞋反馈

18.current_activity
current_activity(self):

Retrieves the current activity on the device.
获取当前的activity
用法 print(driver.current_activity)

19. wait_activity
wait_activity(self, activity, timeout, interval=1):

Wait for an activity: block until target activity presents or time out.
    This is an Android-only method.
    等待指定的activity出现直到超时interval为扫描间隔1秒
即每隔几秒获取一次当前的activity
返回的True  False
    :Agrs:
     - activity - target activity
     - timeout - max wait time, in seconds
     - interval - sleep interval between retries, in seconds
用法driver.wait_activity(.activity.xxx,5,2)

20. background_app
background_app(self, seconds):

Puts the application in the background on the device for a certain duration.
    后台运行app多少秒
    :Args:
     - seconds - the duration for the application to remain in the background
用法 driver.background_app(5)   置后台5秒后再运行

21.is_app_installed
is_app_installed(self, bundle_id):

Checks whether the application specified by `bundle_id` is installed on the device.
    检查app是否有安装
返回 True or False
    :Args:
     - bundle_id - the id of the application to query
用法 driver.is_app_installed(com.xxxx)

22.install_app
install_app(self, app_path):

Install the application found at `app_path` on the device.
    安装app,app_path为安装包路径
    :Args:
     - app_path - the local or remote path to the application to install
用法 driver.install_app(app_path)

23.remove_app
remove_app(self, app_id):

Remove the specified application from the device.
    删除app
    :Args:
     - app_id - the application id to be removed
用法 driver.remove_app(com.xxx.)

24.launch_app
launch_app(self):

Start on the device the application specified in the desired capabilities.
启动app
用法 driver.launch_app()

25.close_app
close_app(self):

Stop the running application, specified in the desired capabilities, on the device.
关闭app
用法 driver.close_app()
启动和关闭app运行好像会出错

26. start_activity
start_activity(self, app_package, app_activity, **opts):

Opens an arbitrary activity during a test. If the activity belongs to
    another application, that application is started and the activity is opened.

    This is an Android-only method.
    在测试过程中打开任意活动如果活动属于另一个应用程序该应用程序的启动和活动被打开
这是一个安卓的方法
    :Args:
    - app_package - The package containing the activity to start.
    - app_activity - The activity to start.
    - app_wait_package - Begin automation after this package starts (optional).
    - app_wait_activity - Begin automation after this activity starts (optional).
    - intent_action - Intent to start (optional).
    - intent_category - Intent category to start (optional).
    - intent_flags - Flags to send to the intent (optional).
    - optional_intent_arguments - Optional arguments to the intent (optional).
    - stop_app_on_reset - Should the app be stopped on reset (optional)?
用法 driver.start_activity(app_package, app_activity)

27.lock
lock(self, seconds):

Lock the device for a certain period of time. iOS only.
    锁屏一段时间  iOS专有
    :Args:
     - the duration to lock the device, in seconds
用法 driver.lock()

28.shake
shake(self):

Shake the device.
摇一摇手机
用法 driver.shake()

29.open_notifications
open_notifications(self):

Open notification shade in Android (API Level 18 and above)
打系统通知栏仅支持API 18 以上的安卓系统
用法 driver.open_notifications()

30.network_connection
network_connection(self):

Returns an integer bitmask specifying the network connection type.
    Android only.
返回网络类型  数值
    Possible values are available through the enumeration `appium.webdriver.ConnectionType`

用法 driver.network_connection

31. set_network_connection
set_network_connection(self, connectionType):

Sets the network connection type. Android only.
    Possible values:
        Value (Alias)      | Data | Wifi | Airplane Mode
        -------------------------------------------------
        0 (None)           | 0    | 0    | 0
        1 (Airplane Mode)  | 0    | 0    | 1
        2 (Wifi only)      | 0    | 1    | 0
        4 (Data only)      | 1    | 0    | 0
        6 (All network on) | 1    | 1    | 0
    These are available through the enumeration `appium.webdriver.ConnectionType`
    设置网络类型
    :Args:
     - connectionType - a member of the enum appium.webdriver.ConnectionType

用法  先加载from appium.webdriver.connectiontype import ConnectionType
dr.set_network_connection(ConnectionType.WIFI_ONLY)
ConnectionType的类型有
NO_CONNECTION = 0
AIRPLANE_MODE = 1
WIFI_ONLY = 2
DATA_ONLY = 4
ALL_NETWORK_ON = 6

32. available_ime_engines
available_ime_engines(self):

Get the available input methods for an Android device. Package and activity are returned (e.g., ['com.android.inputmethod.latin/.LatinIME'])
    Android only.
返回安卓设备可用的输入法
用法print(driver.available_ime_engines)

33.is_ime_active
is_ime_active(self):

Checks whether the device has IME service active. Returns True/False.
    Android only.
检查设备是否有输入法服务活动返回真/
安卓
用法 print(driver.is_ime_active())

34.activate_ime_engine
activate_ime_engine(self, engine):

Activates the given IME engine on the device.
    Android only.
    激活安卓设备中的指定输入法设备可用输入法可以从available_ime_engines获取
    :Args:
     - engine - the package and activity of the IME engine to activate (e.g.,
        'com.android.inputmethod.latin/.LatinIME')

用法 driver.activate_ime_engine(com.android.inputmethod.latin/.LatinIME)

35.deactivate_ime_engine
deactivate_ime_engine(self):

Deactivates the currently active IME engine on the device.
    Android only.
关闭安卓设备当前的输入法
用法 driver.deactivate_ime_engine()

36.active_ime_engine
active_ime_engine(self):

Returns the activity and package of the currently active IME engine (e.g.,
    'com.android.inputmethod.latin/.LatinIME').
    Android only.
    返回当前输入法的包名
用法 driver.active_ime_engine

37. toggle_location_services
toggle_location_services(self):

Toggle the location services on the device. Android only.
打开安卓设备上的位置定位设置
用法 driver.toggle_location_services()

38.set_location
set_location(self, latitude, longitude, altitude):

Set the location of the device
    设置设备的经纬度
    :Args:
     - latitude纬度 - String or numeric value between -90.0 and 90.00
     - longitude经度 - String or numeric value between -180.0 and 180.0
     - altitude海拔高度- String or numeric value
用法 driver.set_location(纬度经度高度)

39.tag_name
tag_name(self):

This element's ``tagName`` property.
返回元素的tagName属性
经实践返回的是class name
用法 element.tag_name()

40.text
text(self):

The text of the element.
    返回元素的文本值
用法 element.text

41.click
click(self):

Clicks the element.
  点击元素
用法 element.click()

42.submit
submit(self):

Submits a form.
    提交表单
用法 暂无

43.clear
clear(self):

Clears the text if it's a text entry element.
    清除输入的内容
用法 element.clear()

44.get_attribute
get_attribute(self, name):
详见@chenhengjie123超级链接

Gets the given attribute or property of the element.
1获取 content-desc 的方法为 get_attribute("name") 而且还不能保证返回的一定是 content-desc content-desc 为空时会返回 text 属性值
2get_attribute 方法不是我们在 uiautomatorviewer 看到的所有属性都能获取的此处的名称均为使用 get_attribute 时使用的属性名称):
可获取的
字符串类型
name(返回 content-desc  text)
text(返回 text)
className(返回 class只有 API=>18 才能支持)
resourceId(返回 resource-id只有 API=>18 才能支持)
    This method will first try to return the value of a property with the
    given name. If a property with that name doesn't exist, it returns the
    value of the attribute with the same name. If there's no attribute with
    that name, ``None`` is returned.

    Values which are considered truthy, that is equals "true" or "false",
    are returned as booleans.  All other non-``None`` values are returned
    as strings.  For attributes or properties which do not exist, ``None``
    is returned.

    :Args:
        - name - Name of the attribute/property to retrieve.

    Example::

        # Check if the "active" CSS class is applied to an element.
        is_active = "active" in target_element.get_attribute("class")
用法 暂无

45.is_selected
is_selected(self):

Returns whether the element is selected.

    Can be used to check if a checkbox or radio button is selected.
返回元素是否选择
可以用来检查一个复选框或单选按钮被选中
用法 element.is_slected()

46.is_enabled
is_enabled(self):

Returns whether the element is enabled.
    返回元素是否可用True of False
用法 element.is_enabled()

47.find_element_by_id
find_element_by_id(self, id_):

Finds element within this element's children by ID.
    通过元素的ID定位元素
    :Args:
        - id_ - ID of child element to locate.
用法 driver. find_element_by_id(“id”)

48. find_elements_by_id
find_elements_by_id(self, id_):

Finds a list of elements within this element's children by ID.
    通过元素ID定位,含有该属性的所有元素
    :Args:
        - id_ - Id of child element to find.
用法 driver. find_elements_by_id(“id”)

49. find_element_by_name 1.5 以上的版本已弃用
find_element_by_name(self, name):

Finds element within this element's children by name.
     通过元素Name定位(元素的名称属性text)
    :Args:
        - name - name property of the element to find.
用法 driver.find_element_by_name(“name”)
替代方法 driver.find_element_by_xpath("//*[@text='我的']")
还有其它方法的话欢迎补充

50. find_elements_by_name
find_elements_by_name(self, name):

Finds a list of elements within this element's children by name.
    通过元素Name定位(元素的名称属性text),含有该属性的所有元素
    :Args:
        - name - name property to search for.
用法 driver.find_element_by_name(“name”)

51. find_element_by_link_text
find_element_by_link_text(self, link_text):

Finds element within this element's children by visible link text.
    通过元素可见链接文本定位
    :Args:
        - link_text - Link text string to search for.
用法 driver.find_element_by_link_text(“text”)

52. find_elements_by_link_text
find_element_by_link_text(self, link_text):

 Finds a list of elements within this element's children by visible link text
    通过元素可见链接文本定位,含有该属性的所有元素
    :Args:
        - link_text - Link text string to search for.
用法 driver.find_elements_by_link_text(“text”)

53. find_element_by_partial_link_text
find_element_by_partial_link_text(self, link_text):

Finds element within this element's children by partially visible link text.
    通过元素部分可见链接文本定位
    :Args:
        - link_text - Link text string to search for.
driver. find_element_by_partial_link_text(“text”)

54. find_elements_by_partial_link_text
find_elements_by_partial_link_text(self, link_text):

Finds a list of elements within this element's children by link text.
    通过元素部分可见链接文本定位,含有该属性的所有元素
    :Args:
        - link_text - Link text string to search for.
driver. find_elements_by_partial_link_text(“text”)

55. find_element_by_tag_name
find_element_by_tag_name(self, name):

Finds element within this element's children by tag name.
    通过查找html的标签名称定位元素
    :Args:
        - name - name of html tag (eg: h1, a, span)
用法  driver.find_element_by_tag_name(“name”)

56. find_elements_by_tag_name
find_elements_by_tag_name(self, name):

Finds a list of elements within this element's children by tag name.
   通过查找html的标签名称定位所有元素
    :Args:
        - name - name of html tag (eg: h1, a, span)
用法driver.find_elements_by_tag_name(“name”)

57. find_element_by_xpath
find_element_by_xpath(self, xpath):

Finds element by xpath.
    通过Xpath定位元素详细方法可参阅http://www.w3school.com.cn/xpath/
    :Args:
        xpath - xpath of element to locate.  "//input[@class='myelement']"

    Note: The base path will be relative to this element's location.

    This will select the first link under this element.

    ::

        myelement.find_elements_by_xpath(".//a")

    However, this will select the first link on the page.

    ::

        myelement.find_elements_by_xpath("//a")

用法 find_element_by_xpath(“//*”)

58. find_elements_by_xpath
find_elements_by_xpath(self, xpath):

Finds elements within the element by xpath.

    :Args:
        - xpath - xpath locator string.

    Note: The base path will be relative to this element's location.

    This will select all links under this element.

    ::

        myelement.find_elements_by_xpath(".//a")

    However, this will select all links in the page itself.

    ::

        myelement.find_elements_by_xpath("//a")

用法find_elements_by_xpath(“//*”)

59. find_element_by_class_name
find_element_by_class_name(self, name):

Finds element within this element's children by class name.
    通过元素class name属性定位元素
    :Args:
        - name - class name to search for.
用法 driver. find_element_by_class_name(“android.widget.LinearLayout”)

60. find_elements_by_class_name
find_elements_by_class_name(self, name):

Finds a list of elements within this element's children by class name.
    通过元素class name属性定位所有含有该属性的元素
    :Args:
        - name - class name to search for.
用法 driver. find_elements_by_class_name(“android.widget.LinearLayout”)

61. find_element_by_css_selector
find_element_by_css_selector(self, css_selector):

Finds element within this element's children by CSS selector.
    通过CSS选择器定位元素
    :Args:
        - css_selector - CSS selctor string, ex: 'a.nav#home'

62.send_keys
send_keys(self, *value):

Simulates typing into the element.
    在元素中模拟输入开启appium自带的输入法并配置了appium输入法后可以输入中英文
    :Args:
        - value - A string for typing, or setting form fields.  For setting
        file inputs, this could be a local file path.

    Use this to send simple key events or to fill out form fields::

        form_textfield = driver.find_element_by_name('username')
        form_textfield.send_keys("admin")

    This can also be used to set file inputs.

    ::

        file_input = driver.find_element_by_name('profilePic')
        file_input.send_keys("path/to/profilepic.gif")
        # Generally it's better to wrap the file path in one of the methods
        # in os.path to return the actual path to support cross OS testing.
        # file_input.send_keys(os.path.abspath("path/to/profilepic.gif"))
driver.element.send_keys(中英)

63. is_displayed
is_displayed(self):

Whether the element is visible to a user.    
此元素用户是否可见简单地说就是隐藏元素和被控件挡住无法操作的元素仅限 Seleniumappium是否实现了类似功能不是太确定这一项都会返回 False

用法 driver.element.is_displayed()

64. location_once_scrolled_into_view
location_once_scrolled_into_view(self):

"""THIS PROPERTY MAY CHANGE WITHOUT WARNING. Use this to discover
   where on the screen an element is so that we can click it. This method
   should cause the element to be scrolled into view.

   Returns the top lefthand corner location on the screen, or ``None`` if
   the element is not visible.
   暂不知道用法
   """

65.size
size(self):

The size of the element.
获取元素的大小高和宽

new_size["height"] = size["height"]
new_size["width"] = size["width"]

用法 driver.element.size

66. value_of_css_property
value_of_css_property(self, property_name):

The value of a CSS property.
CSS属性

用法 暂不知

67.location
location(self):

The location of the element in the renderable canvas.
    获取元素左上角的坐标

用法 driver.element.location
'''返回element的x坐标, int类型'''
driver.element.location.get('x')
'''返回element的y坐标, int类型'''
driver.element.location.get('y')

68.rect
rect(self):

A dictionary with the size and location of the element.
    元素的大小和位置的字典

69. get_screenshot_as_base64
screenshot_as_base64(self):

Gets the screenshot of the current window as a base64 encoded string
        which is useful in embedded images in HTML.
 获取当前元素的截图为Base64编码的字符串,在HTML中嵌入的图像
 :Usage:
     img_b64 = element.get_screenshot_as_base64

70.execute_script
execute_script(self, script, *args):

    Synchronously Executes JavaScript in the current window/frame.
在当前窗口/框架特指 Html  iframe 同步执行 javascript 代码你可以理解为如果这段代码是睡眠5秒这五秒内主线程的 javascript 不会执行
    :Args:
     - script: The JavaScript to execute.
     - \*args: Any applicable arguments for your JavaScript.

    :Usage:
        driver.execute_script('document.title')

71.execute_async_script
execute_async_script(self, script, *args):

    Asynchronously Executes JavaScript in the current window/frame.
插入 javascript 代码只是这个是异步的也就是如果你的代码是睡眠5秒那么你只是自己在睡页面的其他 javascript 代码还是照常执行
    :Args:
     - script: The JavaScript to execute.
     - \*args: Any applicable arguments for your JavaScript.

    :Usage:
        driver.execute_async_script('document.title')

72.current_url
current_url(self):

    Gets the URL of the current page.
    获取当前页面的网址
    :Usage:
        driver.current_url
用法 driver.current_url

73. page_source
page_source(self):

Gets the source of the current page.
获取当前页面的源
:Usage:
    driver.page_source

74.close
close(self):

Closes the current window.
关闭当前窗口
:Usage:
    driver.close()

75.quit
quit(self):

Quits the driver and closes every associated window.
退出脚本运行并关闭每个相关的窗口连接
:Usage:
    driver.quit()

76.get_screenshot_as_file
get_screenshot_as_file(self, filename):

    Gets the screenshot of the current window. Returns False if there is
       any IOError, else returns True. Use full paths in your filename.
  截取当前窗口的截图如果有写入错误会返回False其它返回True
filename 使用绝对路径
    :Args:
     - filename: The full path you wish to save your screenshot to.

    :Usage:
       driver.get_screenshot_as_file('c:/foo.png')

77.get_window_size
get_window_size(self, filename):

  Gets the width and height of the current window.
获取当前屏幕的分辨率长和宽
  :Usage:
      driver.get_window_size()
共收到 101 条回复 时间 点赞

建议可以附一个工程文件~

huan #2 · 2015年12月02日 Author

#1 楼 @xushizhao 例子么?

#2 楼 @huanzhijin 64. location_once_scrolled_into_view 这里 markdown 有问题

huan #4 · 2015年12月02日 Author

#3 楼 @chenhengjie123 找不到编辑的按钮。。。。额。。。。

#4 楼 @huanzhijin 右下角铅笔图标。

huan #109 · 2015年12月02日 Author

#5 楼 @chenhengjie123 OK,已全改好了

受用,感谢,完整的 python 版中文 api。

huan #9 · 2015年12月02日 Author

#7 楼 @wxhhxx123 包含大部分的方法了,完整倒不敢说

44.get_attribute 用法我来补充个, 正好刚刚用了这个、

button.get_attribute('enabled')  

这个表示查看 button 的 enabled 属性, 返回的是这个属性的值, 类似的还可以有

button.get_attribute('clickable'')
button.get_attribute('checked')
button.get_attribute('selected')
button.get_attribute('text')

等等。。

huan #11 · 2015年12月02日 Author

67.location

返回的是字典
用法:

print button.location
'''返回button的x坐标, int类型'''
print button.location.get('x')
'''返回button的y坐标, int类型'''
print button.location.get('y')

方便小白。

#10 楼 @lylyliuyu get attribute 这个可以参考我以前的一个帖子:https://testerhome.com/topics/2606,不过有点超出 API 文档的范畴了。

整体看了一遍,写的不错,有些坑有写出来了,不过有一小部分的翻译有问题。

  1. is_displayed Whether the element is visible to a user. 该元素是否是可见的用户 翻译错了,应该是此元素用户是否可见。简单地说就是隐藏元素和被控件挡住无法操作的元素(仅限 Selenium,appium 是否实现了类似功能不是太确定)这一项都会返回 False

70.execute_script

Synchronously Executes JavaScript in the current window/frame.
  同步执行的JavaScript在当前窗口/框架

这个正确翻译应该是:在当前窗口/框架(特指 Html 的 iframe )同步执行 javascript 代码。你可以理解为如果这段代码是睡眠 5 秒,这五秒内主线程的 javascript 不会执行。

71.execute_async_script
execute_async_script(self, script, *args):

Asynchronously Executes JavaScript in the current window/frame.
异步执行JavaScript在当前窗口/框架。

和上一个类似,也是插入 javascript 代码,只是这个是异步的,也就是如果你的代码是睡眠 5 秒,那么你只是自己在睡,页面的其他 javascript 代码还是照常执行。

#15 楼 @anikikun
#16 楼 @lylyliuyu 我只是小兵,最认真的还是 @huanzhijin ,他做的事情最多。

楼主太无私了~怒赞

huan #19 · 2015年12月03日 Author

#14 楼 @chenhengjie123 牛,我有空修改一下

huan #20 · 2015年12月03日 Author

#12 楼 @lylyliuyu 谢谢指正,有空我修改下,方便大家查阅

纸巾你好纸巾再见

#20 楼 @huanzhijin 纸巾修改下吧,然后 @chenhengjie123 加到 wiki 里去。

#23 楼 @lihuazhang 已加入 wifi 首页。

huan #25 · 2015年12月06日 Author

#23 楼 @lihuazhang 嗯,已经改好

huan #89 · 2015年12月07日 Author

#22 楼 @mrqyoung 叫受你好,叫受债见

此文甚好 容我细品

28楼 已删除

good~收藏~

甚好

用 current_activity() 提示 object is not callable

huan #32 · 2016年01月11日 Author

#31 楼 @kesha0 用法是 driver.current_activity() 我试过是可以的

怎么没有 JAVA 的 api ?

36楼 已删除

#31 楼 @kesha0 我也试了 'WebDriver' object has no attribute 'current_activity',请问你最后是怎么解决的?

这个好

@huanzhijin 请问如果 app 是一个 Activity 上面有几个 fragment,然后怎么等待 fragment 加载出来?或者等待某个 text 加载出来?看到里面有写等待 Activity 加载出来的语句

huan #43 · 2016年01月23日 Author

#42 楼 @sanghuan1234 等某个 text 加载出来有很多种方法的啊,简单点用 name 查找,设定个超时时间或查找次数就可以了

这个赞,很用心的分享

有没有判断页面元素是否存在的方法?
想通过判断页面元素是否存在来看 test 是否 success

huan #46 · 2016年01月26日 Author

#45 楼 @wenkaiding appium 已经提供给你很多基本基础的方法了,至于你是要造轮子还是车子,看你自己了

#46 楼 @huanzhijin 一般自动化测试 case 成功的 判断标准是什么?第一次做不太清楚。

@huanzhijin 请问如果 app 是一个 Activity 上面有几个 fragment,然后怎么等待 fragment 加载出来?或者等待某个 text 加载出来?看到里面有写等待 Activity 加载出来的语句
#43 楼 @huanzhijin 非常感谢你的回复,刚开始做 appium 自动化没多久,弱弱的问一句,控件如何设置超时间和查找次数,语句怎么写?文中提到了 wait_Activity,这个方法只能等待 Activity 加载出来,还有其他方法吗,等待 text 加载出来?谢谢~

#49 楼 @sanghuan1234 webdriverwait,你搜下

你好,有没有向 iPhone 推送文件的 api 呢?

huan #52 · 2016年02月20日 Author

#51 楼 @zhanheng 没看到有,应该是没

#51 楼 @zhanheng 不知道 push_file 行不行

里面貌似没有提供 android 的锁屏和解锁的方法,如果要实现锁屏和唤醒屏幕,要怎么做呢?

#54 楼 @wanlik700c 你可以试试 os.system("adb shell input keyevent 26")

#55 楼 @t880216t 谢谢,今晚回去试试

—— 来自 TesterHome 官方 安卓客户端

纠正一个地方,要获取一个控件的文字,应该是 el.text 而不是 el.text()

huan #58 · 2016年02月23日 Author

#57 楼 @kesha0 嗯嗯

#55 楼 @t880216t 果然是可以的!

mark 下

is_selected 这个方法在安卓上应该用不了,对着一个 checkbox 看了一下无论如何都是 false,亲测 get_attribute('checked') 可用

请问,对于 APP 里混合了 web app,这里的方法可以定位吗

huan #63 · 2016年03月14日 Author

#62 楼 @juan37 可以

#63 楼 @huanzhijin 微信内置的浏览器怎么定位呢?我试了 Switch_to WEBVIEW,但是我打印出来的 contexts 只有 native_app

请问这样的用 xpath 要怎么定位

huan #66 · 2016年03月16日 Author

#64 楼 @juan37 微信内置的好像定位不了

huan #67 · 2016年03月16日 Author

#65 楼 @mymgbaby xpath 语法你到这里自学下吧

#67 楼 @huanzhijin driver.find_element_by_android_uiautomator('.elements()[1].cells()[2]') 请问这里面的参数这么写是什么意思

请问有关于多设备跳转的语句吗?求大神指教?我按顺序从第一个设备一直启动到第三个设备,怎么从第三个设备返回第一个设备?

huan #70 · 2016年04月08日 Author

#68 楼 @mymgbaby 你问的是哪个参数啊??

huan #71 · 2016年04月08日 Author

#69 楼 @XLTH 三台手机???你能从 1 到 3 了,那再启动 1 应该也不难了吧??

为啥我用 python 好的没有的,比如 shake() 、swipe 等等

huan #73 · 2016年04月26日 Author

#72 楼 @muse1021 shake 好像还用不了,swipe 是可以用的

#73 楼 @huanzhijin 请问什么方法可以执行 shake 操作?

huan #75 · 2016年04月27日 Author

#74 楼 @muse1021 不知道

收藏留名

有没有人知道页面页面上没有权限的与有权限(置灰跟高亮)的元素怎么去判断状态?用什么方法?

急急急!!!在线等:
有没有人知道页面页面上没有权限的与有权限(置灰跟高亮)的元素怎么去判断状态?用什么方法?

楼主活雷锋呀,@chenhengjie123 特别认真很适合做测试,哈哈,感谢~~

王明海 [该话题已被删除] 中提及了此贴 08月06日 08:55

@huanzhijin (huan),请问你用过 screenshot_as_base64 方法吗?

    img_b64 = element.screenshot_as_base64()
  File "/Users/zhaoxiangyi/Documents/workspace_main/eengoo_appium/Util/AppiumDriverWrap.py", line 248, in screenshot_as_base64
    self._element.screenshot_as_base64
  File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webelement.py", line 385, in screenshot_as_base64
    return self._execute(Command.ELEMENT_SCREENSHOT)['value']
  File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webelement.py", line 457, in _execute
    return self._parent.execute(command, params)
  File "/Library/Python/2.7/site-packages/selenium/webdriver/remote/webdriver.py", line 233, in execute
    self.error_handler.check_response(response)
  File "build/bdist.macosx-10.11-intel/egg/appium/webdriver/errorhandler.py", line 29, in check_response
    raise wde
WebDriverException: Message: The URL '/wd/hub/session/d80bb7d6-db6a-47ef-9b88-26521ca81572/screenshot/9' did not map to a valid resource

我用了之后返回这个结果,可以指点下我错在哪里了吗?

huan #82 · 2016年08月19日 Author

#81 楼 @yingruoyuan 你好,我看了下,是我写错了,完整的方法应该是 get_screenshot_as_base64

#82 楼 @huanzhijin ,针对 element 对象的截图方法应该是 screenshot_as_base64 吧?如果用 get_screenshot_as_base64,调用的对象应该是 driver,如果用 element 去调用 get_screenshot_as_base64 方法截图,会:

    self._element.get_screenshot_as_base64
AttributeError: 'WebElement' object has no attribute 'get_screenshot_as_base64'

用 self._driver.get_screenshot_as_file(path) 这个方法可以成功截图,不过截图截出来的不是单独控件的截图而是整屏截图,楼主你有能直接成功截出控件的截图的方法吗?

楼主伟大

xinxjxjxj [该话题已被删除] 中提及了此贴 09月18日 10:51
huan #86 · 2016年09月18日 Author

#84 楼 @testTotest 我只是搬下原代码而已

huan #87 · 2016年09月18日 Author

#83 楼 @yingruoyuan 提供下思路给你吧,截取图片后,获取控件的坐标和大小,再用 pil 截图。参考我另篇https://testerhome.com/topics/4502

#87 楼 @huanzhijin ,好的,谢谢,我去试下

请问这些元素使用的话需要调用什么库,为什么我的总是提示'Driver' object has no attribute 'swipe' 'Driver' object has no attribute 'tap'

huan #25 · 2016年11月28日 Author

#89 楼 @245124928 。。。。。你的 appium+python 能跑起来没,能跑起来应该不会问这个问题。。。

@huanzhijin
我这里发现一个语法问题,在 appium1.5.3 以后,swipe 滑动的 python 用法已经改变了,我是在 appium1.6.3 上测试的,正确的 用法是这样的:
self.driver.swipe(sx,sy,dx,dy,t)
其中
sx: 开始点的 x 位置(像素位置,不是分辨率位置,比如 iPhone5s 上,最右边的 sx:640 而不是 320)
sy:开始点的 y 位置
dx:移动的像素距离,300:向左滑动 300 像素位置, -300:向右滑动 300 像素位置
dx:移动的像素距离,300:向上滑动 300 像素位置, -300:向下滑动 300 像素位置

zujie 关于 unittest 中的元素定位问题 中提及了此贴 02月13日 11:12
陈恒捷 回复

wiki

请问,如何自己加一些方法?

新手,学习了

谢谢分享

老马 Appium ApiDemos alert dialog 练习记录 中提及了此贴 01月30日 12:24

感谢楼主

使用 driver.current_url 时报错:
selenium.common.exceptions.WebDriverException: Message: Method has not yet been implemented
有大佬知道是怎么回事吗

123weizheng 回复

什么语言?从报错上看是这个方法尚未实现

pan 回复

用的 Python
self.driver.tap([(580, 66)], 500)
据了解是因为这行代码的原因: 使用了 tap
但是不使用 tap 无法定位。
希望大佬可以给些意见。

huan #106 · 2019年01月12日 Author
123weizheng 回复

你这个报错不太完整呀,tap 在编写此文档时是可用的,现在不怎么用 appium 了不太清楚了

huan 回复

完整的报错,tap 方法是可用的,现在不知道错误在哪,希望有大佬可以指教一下,谢谢,谢谢。
Traceback (most recent call last):
File "D:/Python/appium_text/first_appium.py", line 60, in qcc_parse
print(self.driver.current_url)
File "D:\Anaconde\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 669, in current_url
return self.execute(Command.GET_CURRENT_URL)['value']
File "D:\Anaconde\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "D:\Anaconde\lib\site-packages\appium\webdriver\errorhandler.py", line 29, in check_response
raise wde
File "D:\Anaconde\lib\site-packages\appium\webdriver\errorhandler.py", line 24, in check_response
super(MobileErrorHandler, self).check_response(response)
File "D:\Anaconde\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: Method has not yet been implemented

wolfgao [该话题已被删除] 中提及了此贴 01月18日 18:03
wolfgao Appium 测试开发实践笔记 - ios 部分待续 中提及了此贴 01月18日 18:10
123weizheng 回复

用 touchaction 试试

问下,这个有离线的文档吗?公司内网没法访问外网,看资料特别不方便

huan #113 · 2020年05月12日 Author
往西行 回复

直接复制文档就行了吧,不过这个年代有点久远了,不知道现在还用不用得上

请问 iOS 输入框的光标在最前面,怎么移到最后面删除上次的内容呢?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册