同一 Appium 会话上的多个 iOS 模拟器
Multiple iOS Simulators on same Appium Session
我在安装了 Appium 和 Xcode 的 Mac 上有一个自动化框架 运行ning。我想一次在多个模拟器中 运行 我的测试用例。如何在同一台机器上打开多个模拟器?
根据 Appium 文档,一台机器 (http://appium.io/slate/en/master/?csharp#appium-platform-support) 是不可能的。很可能是因为 Apple Instruments 一次只允许控制一台设备。
但是,如果您有 Selenium Grid,这是可能的。您可以在此处找到这些说明:http://appium.readthedocs.org/en/stable/en/advanced-concepts/grid/ 这需要使用多个 OS X 机器作为节点。
从 Xcode 9 和 Appium 1.7 开始,现在可以做到这一点。关键是 wdaLocalPort
能力。每个模拟器都需要自己的端口。
举个例子,我用的是ruby,其他语言也是类似的:
require 'appium_lib'
opts = {
caps: {
automationName: 'XCUITest',
platformName: 'iOS',
deviceName: 'iPhone 7',
wdaLocalPort: 8001,
app: 'Example.app',
},
}
10.times do
driver = Appium::Driver.new(opts, true)
driver.start_driver.manage.timeouts.implicit_wait = 10
driver.find_element(:name, 'Button').click
driver.driver_quit
end
我懒得实现并发,所以你必须在执行第一个脚本的同时手动执行下一个脚本。
require 'appium_lib'
opts = {
caps: {
automationName: 'XCUITest',
platformName: 'iOS',
deviceName: 'iPhone 8',
wdaLocalPort: 8002,
app: 'Example.app',
},
}
10.times do
driver = Appium::Driver.new(opts, true)
driver.start_driver.manage.timeouts.implicit_wait = 10
driver.find_element(:name, 'Button').click
driver.driver_quit
end
我没怎么玩过这个,但是当我使用两个模拟器时,我 运行 同时进行了两倍的测试。看看它的扩展性会很有趣。
编辑: 原来我可能懒得去实现并发:
require 'appium_lib'
device_names = [
'iPhone 6',
'iPhone 6s',
'iPhone 7',
'iPhone 8',
]
def test(device_name, port)
opts = {
caps: {
automationName: 'XCUITest',
platformName: 'iOS',
deviceName: device_name,
wdaLocalPort: port,
app: 'Example.app',
},
}
driver = Appium::Driver.new(opts, true)
driver.start_driver.manage.timeouts.implicit_wait = 10
driver.find_element(:name, 'Button').click
driver.driver_quit
end
device_names.each_with_index do |device_name, i|
fork {
10.times do
test(device_name, 8000+i)
end
}
end
Process.waitall
以上将启动您在 device_names
数组中指定的模拟器数量,并对每个模拟器进行 运行 10 次测试。我还为基准测试编写了一个更复杂的脚本。在 3 到 4 个模拟器之间,我的性能提高不到 10%,所以 运行 超过 4 个似乎不值得,但我想这取决于你的系统。
随着您启动越来越多的模拟器,您可能会 运行 耗尽系统资源。以下是您的处理方式:
我在安装了 Appium 和 Xcode 的 Mac 上有一个自动化框架 运行ning。我想一次在多个模拟器中 运行 我的测试用例。如何在同一台机器上打开多个模拟器?
根据 Appium 文档,一台机器 (http://appium.io/slate/en/master/?csharp#appium-platform-support) 是不可能的。很可能是因为 Apple Instruments 一次只允许控制一台设备。
但是,如果您有 Selenium Grid,这是可能的。您可以在此处找到这些说明:http://appium.readthedocs.org/en/stable/en/advanced-concepts/grid/ 这需要使用多个 OS X 机器作为节点。
从 Xcode 9 和 Appium 1.7 开始,现在可以做到这一点。关键是 wdaLocalPort
能力。每个模拟器都需要自己的端口。
举个例子,我用的是ruby,其他语言也是类似的:
require 'appium_lib'
opts = {
caps: {
automationName: 'XCUITest',
platformName: 'iOS',
deviceName: 'iPhone 7',
wdaLocalPort: 8001,
app: 'Example.app',
},
}
10.times do
driver = Appium::Driver.new(opts, true)
driver.start_driver.manage.timeouts.implicit_wait = 10
driver.find_element(:name, 'Button').click
driver.driver_quit
end
我懒得实现并发,所以你必须在执行第一个脚本的同时手动执行下一个脚本。
require 'appium_lib'
opts = {
caps: {
automationName: 'XCUITest',
platformName: 'iOS',
deviceName: 'iPhone 8',
wdaLocalPort: 8002,
app: 'Example.app',
},
}
10.times do
driver = Appium::Driver.new(opts, true)
driver.start_driver.manage.timeouts.implicit_wait = 10
driver.find_element(:name, 'Button').click
driver.driver_quit
end
我没怎么玩过这个,但是当我使用两个模拟器时,我 运行 同时进行了两倍的测试。看看它的扩展性会很有趣。
编辑: 原来我可能懒得去实现并发:
require 'appium_lib'
device_names = [
'iPhone 6',
'iPhone 6s',
'iPhone 7',
'iPhone 8',
]
def test(device_name, port)
opts = {
caps: {
automationName: 'XCUITest',
platformName: 'iOS',
deviceName: device_name,
wdaLocalPort: port,
app: 'Example.app',
},
}
driver = Appium::Driver.new(opts, true)
driver.start_driver.manage.timeouts.implicit_wait = 10
driver.find_element(:name, 'Button').click
driver.driver_quit
end
device_names.each_with_index do |device_name, i|
fork {
10.times do
test(device_name, 8000+i)
end
}
end
Process.waitall
以上将启动您在 device_names
数组中指定的模拟器数量,并对每个模拟器进行 运行 10 次测试。我还为基准测试编写了一个更复杂的脚本。在 3 到 4 个模拟器之间,我的性能提高不到 10%,所以 运行 超过 4 个似乎不值得,但我想这取决于你的系统。
随着您启动越来越多的模拟器,您可能会 运行 耗尽系统资源。以下是您的处理方式: