SessionNotCreatedError:无法创建会话:找到某些设备,但无法使用:

SessionNotCreatedError: Could not create a session: Some devices were found, but could not be used:

提问人:Issei Morita 提问时间:8/16/2023 最后编辑:Issei Morita 更新时间:8/17/2023 访问量:104

问:

我正在尝试在 iOS Safari 上自动化 Web 应用程序以进行 e2e 测试。
尽管以下代码适用于 iOS 17 测试版中的模拟器,
但它似乎不适用于真实设备(iPhone 12、iOS 16.6)。

测试代码

const fs = require("fs");
const { Builder, By, Key, until } = require("selenium-webdriver");
const edge = require("selenium-webdriver/edge");
const ie = require("selenium-webdriver/ie");
const chrome = require("selenium-webdriver/chrome");
const safari = require("selenium-webdriver/safari");
const os = require("os");
const path = require("path");
const PNG = require("pngjs").PNG;
const { NodeSSH, Config } = require("node-ssh");
const { execSync } = require("child_process");
const webdriver = require("selenium-webdriver")
const { Preferences, Type, Level } = require("selenium-webdriver/lib/logging")
const wdio = require('webdriverio')
describe("test0", () => {

  const getDriver = async () => {

    const options = new safari.Options()
    const capabilities = webdriver.Capabilities.safari()
    capabilities.setPlatform('ios')
    capabilities.set('safari:deviceType', 'iphone')
    capabilities.set('safari:useSimulator', false)

    const driver = new Builder().forBrowser('safari').withCapabilities(capabilities).setSafariOptions(options).build()

    return driver
  }

  let driver
  beforeAll(async () => {
    driver = await getDriver()
  }, 10000000)
  
afterAll(async () => {
    await driver.quit();
  });

  test("test", async () => {
      await driver.get("https://google.com");
  }, 1000000);
});

当设备在打开时通过真实设备进行测试时,将发生以下错误。Device and SimulatorsXcode > Window > Device and Simulators

 SessionNotCreatedError: Could not create a session: Some devices were found, but could not be used:
    - iPhone (xxx-xxxxxxx): Remote Automation is turned off (turn it on via Settings > Safari > Advanced > Remote Automation)
    - [unknown wireless device]: device is not paired

      at Object.throwDecodedError (../node_modules/selenium-webdriver/lib/error.js:524:15)
      at parseHttpResponse (../node_modules/selenium-webdriver/lib/http.js:601:13)
      at Executor.execute (../node_modules/selenium-webdriver/lib/http.js:529:28)

我试过了什么

我在 iOS 上打开了 , , 设置。Safari > Advanced > Web InspectorSafari > Advanced > Remote AutomationDevelopper > Enable UI Automation

我启用了 safaridriver 运行。safaridriver --enable

版本

Xcode:Xcode 15 测试版。 iOS:iOS 17 测试版。 MacOS:Ventura 13.5。

节点 .js selenium-webdriver Safaridriver

评论


答:

0赞 Issei Morita 8/17/2023 #1

我通过手动生成解决了这个问题,就像下面的代码一样。safaridriver

const fs=require("fs")
const { Builder, By, Key, until, WebDriver }=require("selenium-webdriver")
const edge=require("selenium-webdriver/edge")
const ie=require("selenium-webdriver/ie")
const chrome=require("selenium-webdriver/chrome")
const safari=require("selenium-webdriver/safari")
const os=require("os")
const path=require("path")
const PNG=require("pngjs").PNG
const { NodeSSH, Config }=require("node-ssh")
const { execSync, spawn }=require("child_process")
const webdriver=require("selenium-webdriver")
const { Preferences, Type, Level }=require("selenium-webdriver/lib/logging")
const { Executor, HttpClient }=require('selenium-webdriver/http')
const wdio=require('webdriverio')

describe("test0", () => {

  const getDriver=async () => {
    const serverOpts={
      port: 4723,
      hostname: 'localhost',
    }
    const url=`http://${serverOpts.hostname}:${serverOpts.port}`
    const safariDriver=spawn('safaridriver', ['-p', `${serverOpts.port}`, '--diagnose'], { shell: true, env: process.env, detached: false })

    safariDriver.stdout.pipe(process.stdout)
    safariDriver.stderr.pipe(process.stderr)

    await new Promise((resolve) => {
      safariDriver.on('spawn', () => {
        setTimeout(() => {
          resolve()
        }, 3000)
      })
    })

    const executor=
      new Executor(
        new HttpClient(url),
        null,
        null
      )


    return WebDriver.createSession(executor, {
      platformName: 'iOS',
      browserName: 'safari',
      'appium:automationName': 'Safari',
      'safari:deviceType': 'iphone',
      'safari:useSimulator': false,
    }, () => { safariDriver.kill() })
  }

  let driver
  beforeAll(async () => {
    driver = await getDriver()
  }, 10000000)
  
afterAll(async () => {
    await driver.quit();
  });

  test("test", async () => {
      await driver.get("https://google.com");
  }, 1000000);
});