You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React-Native-Picker v1.7.2组件在Android/iOS端Appium Inspector中无法查看Picker元素的自动化测试求助

Solutions for Automating react-native-datepicker (v1.7.2) in Appium

Hey there, I’ve run into similar issues with React Native third-party pickers in Appium automation before—let’s walk through some practical solutions to get your expiry date selection working:

1. Use Coordinate-Based Gestures (Quickest Temporary Fix)

Since the picker elements aren’t visible to Appium’s inspectors, you can target the relative screen coordinates of the Cancel/Confirm buttons (they’re usually fixed in the picker’s footer). This works across Android and iOS as long as you calculate positions based on screen size, not hardcoded pixels.

Example (Python Appium Code):

# Get screen dimensions to calculate relative positions
screen_size = driver.get_window_size()
screen_width = screen_size["width"]
screen_height = screen_size["height"]

# Tap Confirm (bottom-right corner, adjust ratios if needed)
driver.tap([(screen_width * 0.85, screen_height * 0.9)])

# Tap Cancel (bottom-left corner)
driver.tap([(screen_width * 0.15, screen_height * 0.9)])

Note:

  • Test this on multiple device sizes to adjust the ratio values (0.85/0.15 for width, 0.9 for height) to match your picker’s button placement.
  • For iOS, you can also use touch_action for more precise control, but tap() works for most cases.

2. Execute React Native JavaScript Directly (More Reliable Than Coordinates)

Appium lets you run JavaScript code inside the React Native context, which can interact with the picker’s internal methods even if they’re invisible to native inspectors. You’ll need to reference the picker’s component (via testID or ref) and trigger its built-in confirm/cancel actions.

Example (Python Appium Code):

First, ask your devs to add a testID to the datepicker component:

// React Native code (dev side)
<DatePicker
  testID="expiry-date-picker"
  // other props
/>

Then use Appium’s execute_script to call the picker’s internal methods:

# Trigger Confirm action on the picker
driver.execute_script("""
  const pickerElement = document.querySelector('[data-testid="expiry-date-picker"]');
  if (pickerElement) {
    // Access the picker's internal instance (matches react-native-picker v1.7.2 structure)
    const pickerInstance = pickerElement._internalInstanceHandle.stateNode;
    pickerInstance.onConfirm(); // Call the built-in confirm method
  }
""")

# Trigger Cancel action
driver.execute_script("""
  const pickerElement = document.querySelector('[data-testid="expiry-date-picker"]');
  if (pickerElement) {
    const pickerInstance = pickerElement._internalInstanceHandle.stateNode;
    pickerInstance.onCancel();
  }
""")

Note:

  • The exact method names (onConfirm, onCancel) come from the react-native-picker v1.7.2 source code—verify these with your dev team if needed.
  • If _internalInstanceHandle doesn’t work, try _reactInternalInstance (depends on your app’s React Native version).

3. Ask Devs to Add Accessibility Labels (Most Sustainable Fix)

Even if devs can’t add IDs to the internal buttons, they can pass accessibility props to the picker’s child components. The react-native-picker v1.7.2 supports passing props to the confirm/cancel buttons via confirmBtnProps and cancelBtnProps.

Example (React Native Code, Dev Side):

<DatePicker
  // other props
  pickerProps={{
    confirmBtnProps: { accessibilityLabel: "confirm-expiry-date" },
    cancelBtnProps: { accessibilityLabel: "cancel-expiry-date" }
  }}
/>

Then you can locate the buttons in Appium using their accessibility labels:

# Android
confirm_btn = driver.find_element_by_accessibility_id("confirm-expiry-date")
# iOS
confirm_btn = driver.find_element_by_ios_predicate("label == 'confirm-expiry-date'")

confirm_btn.click()

This is the most maintainable solution because it doesn’t depend on screen coordinates or internal RN implementation details.

4. Directly Set the Date Input Value (Bypass the Picker Entirely)

If the datepicker is tied to an input field, you can skip interacting with the picker altogether and set the input’s value directly.

Example (Python Appium Code):

# Locate the date input field via testID
date_input = driver.find_element_by_test_id("expiry-date-input")

# If the input is editable, send keys directly
date_input.send_keys("2025-12-31")

# If the input is read-only, use JavaScript to set the value
driver.execute_script("arguments[0].value = '2025-12-31';", date_input)

# Trigger a change event to update the React Native state
driver.execute_script("""
  const event = new Event('change');
  arguments[0].dispatchEvent(event);
""", date_input)

Note:

  • This works only if the input field’s state is linked to the picker’s selected date. Ask your devs to confirm this is the case for your app.

内容的提问来源于stack exchange,提问作者ser2022

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:27:38