C#以编程方式启动Appium-目标机器主动拒绝它
我想使用C#以编程方式启动Appium服务器。 当我使用Appium窗口手动启动Appium时,它会成功启动: 但当我自动运行它时,通常会出现异常:C#以编程方式启动Appium-目标机器主动拒绝它,c#,selenium,appium,C#,Selenium,Appium,我想使用C#以编程方式启动Appium服务器。 当我使用Appium窗口手动启动Appium时,它会成功启动: 但当我自动运行它时,通常会出现异常: "An unhandled exception of type 'OpenQA.Selenium.WebDriverException' occurred in WebDriver.dll Additional information: Unexpected error. System.Net.WebException: Unable to c
"An unhandled exception of type 'OpenQA.Selenium.WebDriverException' occurred in WebDriver.dll
Additional information: Unexpected error. System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 127.0.0.1:4723"
这是启动Appium服务器的c#代码:
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "C:/Program Files (x86)/Appium/node.exe";
startInfo.Arguments = @"""C:/Program Files (x86)/Appium/node.exe lib/server/main.js"" --address 127.0.0.1 --port 4723 --session-override --platform-name Android --platform-version 23 --automation-name Appium --log-no-color";
process.StartInfo = startInfo;
process.Start();
capabilities = new DesiredCapabilities();
capabilities.SetCapability("deviceName", "Samsung S6");
capabilities.SetCapability("platformName", "Android");
capabilities.SetCapability("platformVersion", "5.0.2");
capabilities.SetCapability(CapabilityType.BrowserName, "Chrome");
driver = new RemoteWebDriver(new Uri("http://127.0.0.1:4723/wd/hub"), capabilities, TimeSpan.FromSeconds(30));
我读了这些问题,但对我没有帮助:
为什么我启动时手动启动成功,但是,当我以同样的编程方式启动它时,我被拒绝了?这可能是因为服务器实例已经在端口4723上运行,请尝试将端口号更改为5555或任何随机的4位数字。以下是我在ruby中以编程方式启动并杀死appium的步骤 我创建了一个配置文件,启动appium并在其启动时进行检查
def run_appium_service
#this command kill appium if for some reason it wasnt killed after a
#previus execution, so i dont get the "is the server already running?"
#error when try to start, another way could be check if its up and start
#only if its not
Process.fork { system 'killall node > /dev/null' }
system '> tmp/appium.log'
Process.fork { system 'appium --log-level debug > tmp/appium.log' }
#wait appium load
t = 10
until !(File.readlines(project_home + "/tmp/appium.log").grep(/interface listener started/).empty?) or t == 0 do
sleep(0.5)
t -= 1
end
end
上述方法仅启动appium服务器,而不启动驱动程序。
要启动驱动程序,我创建了以下两种方法:
我把它叫做我的RSpec挂钩,在套房前
def capabilities(options = {})
caps = Hash.new
caps.default = {
platformName: 'iOS',
deviceName: get_device_name,
app: app_ipa,
launchTimeout: 100000,
autoAcceptAlerts: false,
newCommandTimeout: 12000,
udid: get_udid,
fullReset: false
}
caps.default.merge(options)
end
def start_appium_driver
caps = capabilities
$appium = Appium::Driver.new(caps: caps)
$browser = $appium.start_driver
Appium.promote_appium_methods RSpec::Core::ExampleGroup
end
这是我的spec-config文件,它使所有的东西都工作在一起
module SpecHelper
run_appium_service
RSpec.configure do |config|
config.before :suite do
start_appium_driver
end
config.after :suite do
if defined? driver
driver_quit
end
end
end
end
“目标计算机主动拒绝”异常(TCP/IP)意味着可以访问IP地址,但无法连接到指定端口上的服务器 如何调试 步骤1:检查服务器是否正在侦听您尝试连接的端口: 在服务器计算机上,使用此命令(您需要管理员权限): 这将需要一段时间(有时一分钟左右),但一旦命令执行完毕,它将在您的D:drive中创建一个portscan.txt文件。在该文件中搜索您的端口并检查其是否已打开
步骤2:如果端口已打开,但仍然无法连接。这意味着防火墙已经阻止了它。在防火墙(服务器端)中添加异常,在大多数情况下,您应该能够连接到端口。对于最新的Appium服务器,当通过功能/驱动程序选项初始化客户端驱动程序时,可以通过编程启动驱动程序实例 我在MacCatalina中使用了Appium.WebDriver 4.1.1.NET客户端库(C#),安装了Appium server 1.17.1
//初始化功能
AppiumOptions AppiumOptions=新的AppiumOptions();
//声明功能
...
//初始化iOS驱动程序
var iosDriver=新的iosDriver(应用程序选项);
//初始化android驱动程序
var androidDriver=新的androidDriver(应用程序选项);
无需从命令行启动appium服务器。我是在ruby中这样做的,现在当我启动rspec测试时,它会启动appium,并在测试运行后杀死它。不确定这是否会有帮助,但如果你愿意,我可以用我的代码发布一个答案。这个错误是因为appium已经在运行了,你可以通过调用killall node来杀死它,如果它是一台mac机器,你必须在测试后加入杀死appium的代码,这样你就不会再有这个问题了是的,如果你可以发布你的代码,谢谢,在尝试启动Appium Server之前,我如何检查它当前是否正在运行?目前我不知道如何检查,但我将进行研究并与您分享。改变港口对你有用吗?
netstat -ab > D:\portscan.txt
//Initialise capabilities
AppiumOptions appiumOptions = new AppiumOptions();
//Declare capabilities
...
//Initialise the iOS driver
var iosDriver = new IOSDriver<IMobileElement<AppiumWebElement>>(appiumOptions);
//Initialise the android driver
var androidDriver = new AndroidDriver<IMobileElement<AppiumWebElement>>(appiumOptions);