java Appium服务器在等待时自动退出会话

ac1kyiln  于 2023-05-15  发布在  Java
关注(0)|答案(2)|浏览(159)

我正在Android平台上使用Appium进行自动化。因为某些原因,我需要在考试期间等待一段时间。但是,如果Appium在大约4秒内没有收到命令,它会自动退出会话。谁能帮我告诉我如何让Appium不退出我的驱动程序。
我尝试将“newCommandTimeout”添加到capability,但它不起作用。

capabilities.setCapability("newCommandTimeout", 120000);

Appium版本:v1.9.1
以下是会话退出时的appium日志:

[W3C] Calling AppiumDriver.deleteSession() with args: ["d9a0e702-f477-439b-8502-aa9d3c93737f"]
[BaseDriver] Event 'quitSessionRequested' logged at 1548332599830 (20:23:19 GMT+0800 (Malay Peninsula Standard Time))
[Appium] Removing session d9a0e702-f477-439b-8502-aa9d3c93737f from our master session list
[AndroidDriver] Shutting down Android driver

2019年1月29日更新:

按照大多数人的建议,我尝试将300设置为newCommandTimeout

capabilities.setCapability("newCommandTimeout", 300);

会话仍在退出。我使用Thread.sleep(5000)让脚本等待。以下是在Appium中创建会话和关闭会话的日志。添加时间戳。看起来会话在等待10秒后自动关闭。

[2019-01-29 01:03:51][Appium] Creating new AndroidDriver (v4.1.1) session
[2019-01-29 01:03:51][Appium] Capabilities:
[2019-01-29 01:03:51][Appium]   platform: ANDROID
[2019-01-29 01:03:51][Appium]   platformName: android
[2019-01-29 01:03:51][Appium]   appActivity: *****
[2019-01-29 01:03:51][Appium]   appPackage: *****
[2019-01-29 01:03:51][Appium]   deviceName: *****
[2019-01-29 01:03:51][Appium]   language: en
[2019-01-29 01:03:51][Appium]   locale: US
[2019-01-29 01:03:51][Appium]   newCommandTimeout: 300
<SOME LOGS OMITTED>
[2019-01-29 01:04:10][HTTP] <-- POST /wd/hub/session 200 18650 ms - 913
[2019-01-29 01:04:10][HTTP] 
[2019-01-29 01:04:10][HTTP] --> GET /wd/hub/session/f1dbcd92-fa13-4fc7-a9fd-e6a82b55f9e7
[2019-01-29 01:04:10][HTTP] {}
[2019-01-29 01:04:10][HTTP] <-- GET /wd/hub/session/f1dbcd92-fa13-4fc7-a9fd-e6a82b55f9e7 200 5 ms - 845
[2019-01-29 01:04:10][HTTP] 
[2019-01-29 01:04:10][HTTP] --> GET /wd/hub/session/f1dbcd92-fa13-4fc7-a9fd-e6a82b55f9e7
[2019-01-29 01:04:10][HTTP] <-- GET /wd/hub/session/f1dbcd92-fa13-4fc7-a9fd-e6a82b55f9e7 200 3 ms - 845
[2019-01-29 01:04:10][HTTP] 
[2019-01-29 01:04:20][HTTP] --> DELETE /wd/hub/session/f1dbcd92-fa13-4fc7-a9fd-e6a82b55f9e7
[2019-01-29 01:04:20][HTTP] {}
[2019-01-29 01:04:20][W3C] Calling AppiumDriver.deleteSession() with args: ["f1dbcd92-fa13-4fc7-a9fd-e6a82b55f9e7"]
[2019-01-29 01:04:20][BaseDriver] Event 'quitSessionRequested' logged at 1548738260177 (13:04:20 GMT+0800 (Malay Peninsula Standard Time))
[2019-01-29 01:04:20][Appium] Removing session f1dbcd92-fa13-4fc7-a9fd-e6a82b55f9e7 from our master session list
[2019-01-29 01:04:20][AndroidDriver] Shutting down Android driver

**2019年1月29日更新II:**经过几次试验和错误,我发现根本原因是睡眠后的driver.currentActivity()。我得到了这个例外。因为我们的框架捕捉到了这一点,所以它向Appium发送了关闭信号。

org.openqa.selenium.WebDriverException: java.net.SocketException: Software caused connection abort: recv failed
Build info: version: '3.14.0', revision: 'aacccce0', time: '2018-08-02T20:19:58.91Z'
System info: host: 'localhost', ip: '', os.name: 'Windows 10', os.arch: 'amd64', os.version: '10.0', java.version: '1.8.0_192'
Driver info: driver.version: AndroidDriver
at io.appium.java_client.remote.AppiumCommandExecutor.execute(AppiumCommandExecutor.java:233)

此异常仅在等待10秒后执行driver.currentActivity()时发生。我的目标是让脚本等待,直到它看到另一个活动。目前我的解决方法是:

int counter = 0;
while(oDriver.currentActivity().contains("someActivity")) {
    Thread.sleep(1000);
    counter++;
    if ( counter >= 10 ) break;
}
if (oDriver.currentActivity().contains("someActivity"))
    System.out.println("Reached");
hc8w905p

hc8w905p1#

这是这个问题的正确答案。

capabilities.setCapability("newCommandTimeout", 300);

谢谢@Rajesh Chaudhary。
我将创建一个关于driver.currentActivity()过程中遇到的异常的单独问题。

k4aesqcs

k4aesqcs2#

如果有人来到这里,有同样的问题,但像我一样使用javascript下面是我的解决方案。我正在使用nodejs脚本中的appium。我正在使用版本7.31.1上的webdriverio包在USB连接的物理Android设备上进行自动测试。

{
  platformName: 'Android',
  'appium:automationName': 'UiAutomator2',
  'appium:deviceName': 'Android',
  'appium:appPackage': 'appPackage',
  'appium:appActivity': 'appActivity',
  'appium:newCommandTimeout': 120000
}

添加最后一个属性**'appium:newCommandTimeout':120000**为我定
下面是我使用的安装脚本:

import {
  remote
} from 'webdriverio'
/**
 * Handles options configuration for the webdriver remote instance.
 * @param {string} appPackage - The package name. ex: someapp.android.
 * @param {string} appActivity - The first activity to launch. ex: com.yadaa.ydaa
 * @param {string | undefined} udid - The unique id of the target device. Can be left off if only one device.
 * @returns {Promise<WebdriverIO.Browser>} - Promise containing the webdriver browser object aka driver.
 */
export const appiumSetup = async(appPackage, appActivity, udid) => {
  let port = 4723
  if (process?.env?.APPIUM_PORT) {
    const portNumber = parseInt(process.env.APPIUM_PORT, 10)
    if (!isNaN(portNumber)) {
      port = portNumber
    } else {
      console.error(
        `Invalid APPIUM_PORT: ${process.env.APPIUM_PORT}. Falling back to default port: ${port}`
      )
    }
  }
  return await remote({
    hostname: process.env.APPIUM_HOST || 'localhost',
    port: port || 4723,
    logLevel: 'info',
    capabilities: !udid ?
      {
        platformName: 'Android',
        'appium:automationName': 'UiAutomator2',
        'appium:deviceName': 'Android',
        'appium:appPackage': appPackage,
        'appium:appActivity': appActivity,
        'appium:newCommandTimeout': 120000
      } :
      {
        platformName: 'Android',
        'appium:automationName': 'UiAutomator2',
        'appium:deviceName': 'Android',
        'appium:appPackage': appPackage,
        'appium:appActivity': appActivity,
        'appium:newCommandTimeout': 120000,
        'appium:udid': udid
      }
  })
}

然后用途:

import {
  appiumSetup
} from 'appiumSetup.js'

async someFuncName() {
  const driver = await appiumSetup(
    'com.samsung.android.messaging',
    'com.android.mms.ui.ConversationCompose'
  )
}

相关问题