我们刚刚开始在我的公司与Appium合作,使用它来自动化网站和网络应用程序的测试。
Testing Framework = Nunit 2.6.4
Language used = C#
Mobile Device = Samsung Galaxy S4
Android version = 5.0.1
我之前在一个简单的网站上使用Selenium和Nunit在桌面上进行测试,在我的测试中使用[Test],[TestCase]和[TestCaseSource]属性。
遵循答案文章中的建议: How to integrate Appium with C#?
(这里有更快的文章链接: http://blogs.technet.com/b/antino/archive/2014/09/22/how-to-set-up-a-basic-working-appium-test-environment.aspx)
一名员工设置了一个解决方案,可以对StackOverflow进行简单导航,点击链接并断言:
namespace AppiumTests
{
using System;
using NUnit.Framework;
using AppiumTests.Helpers;
using AppiumTest.Framework;
using OpenQA.Selenium; /* Appium is based on Selenium, we need to include it */
using OpenQA.Selenium.Appium; /* This is Appium */
using OpenQA.Selenium.Appium.Interfaces; /* Not needed for commands shown here. It might be needed in single tests for automation */
using OpenQA.Selenium.Appium.MultiTouch; /* Not needed for commands shown here. It might be needed in single tests for automation */
using OpenQA.Selenium.Interactions; /* Not needed for commands shown here. It might be needed in single tests for automation */
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Appium.Android;
[TestFixture]
public class AndroidAppiumTestSuite
{
private AppiumDriver driver;
private static Uri testServerAddress = new Uri(TestServers.WindowsServer);
private static TimeSpan INIT_TIMEOUT_SEC = TimeSpan.FromSeconds(180); /* Change this to a more reasonable value */
private static TimeSpan IMPLICIT_TIMEOUT_SEC = TimeSpan.FromSeconds(10); /* Change this to a more reasonable value */
[SetUp]
public void BeforeAll()
{
DesiredCapabilities capabilities = new DesiredCapabilities();
TestCapabilities testCapabilities = new TestCapabilities();
//testCapabilities.App = "";
testCapabilities.AutoWebView = true;
testCapabilities.AutomationName = "<just a name>";
testCapabilities.BrowserName = "Chrome"; // Leave empty otherwise you test on browsers
testCapabilities.DeviceName = "Needed if testing on IOS on a specific device. This will be the UDID";
testCapabilities.FwkVersion = "1.0"; // Not really needed
testCapabilities.Platform = TestCapabilities.DevicePlatform.Android; // Or IOS
testCapabilities.PlatformVersion = "5.0.1"; // Not really needed
testCapabilities.AssignAppiumCapabilities(ref capabilities);
driver = new AndroidDriver(testServerAddress, capabilities, INIT_TIMEOUT_SEC);
driver.Manage().Timeouts().ImplicitlyWait(IMPLICIT_TIMEOUT_SEC);
}
[TearDown]
public void AfterAll()
{
TestContext.CurrentContext.Result.ToString();
driver.Quit(); // Always quit, if you don't, next test session will fail
}
/// <summary>
/// Just a simple test to heck out Appium environment.
/// </summary>
[Test]
public void CheckTestEnvironment()
{
driver.Navigate().GoToUrl("http://stackoverflow.com");
driver.FindElementByCssSelector("body > div.topbar > div.network-items > div.login-links-container > a").Click();
Assert.AreEqual("Log in using any of the following services", (driver.FindElementByCssSelector("h2.title")).Text);
}
非常感谢Andrea Tino这个起点。
现在这个工作正常,我的同事设置了这个并向我展示了它已经去度假了,让我的任务就是添加我们现有的测试并在这里和那里调整位。
我在我的testclass中添加了,需要安装Webdriver.Support pacakge,这取决于Webdriver&gt; = 2.46.0
现在,当我运行我的代码时,我在这一行得到一个空引用异常:
driver = new AndroidDriver(testServerAddress, capabilities, INIT_TIMEOUT_SEC);
这是我得到的错误:
AppiumTests.AndroidAppiumTestSuite.CheckTestEnvironment:
SetUp : System.NullReferenceException : Object reference not set to an instance of an object.
TearDown : System.NullReferenceException : Object reference not set to an instance of an object.
所以我的想法是2.46.0中的某些东西意味着我需要提供另一种能力,但我现在已经开始对抗这种情况已经两天没有进展了。
我有appium服务器通信的屏幕截图,但是我还无法将图像链接到XD,所以这里是粘贴的:
info:[debug]设备已启动!准备好命令
info:[debug]将命令超时设置为默认值60秒
info:[debug] Appium会话以sessionId 4575272bba7d11c85414d48cf53ac8e3开始
info:&lt; - POST / wd / hub / session 303 10828.204 ms - 70
info: - &gt; GET / wd / hub / session / 4575272bba7d11c85414d48cf53ac8e3 {}
info:代理[GET / wd / hub / session / 4575272bba7d11c85414d48cf53ac8e3]到[GET http://127.0.0.1:9515/wd/hub/session/4575272bba7d11c85414d48cf53ac8e3] with body:{}
信息:获得状态200的响应:{&#34; sessionId&#34;:&#34; 4575272bba7d11c85414d48cf53ac8e3&#34;,&#34; status&#34;:0,&#34; value&#34;: {&#34; acceptSslCerts&#34;:真,&#34; applicationCacheEnabled&#34;:假,&#34; browserConnectionEnabled&#34;:假,&#34; browserName&#34;:&#34;铬&#34 ;,&#34;铬&#34;:{},&#34; cssSelect ...
info:&lt; - GET / wd / hub / session / 4575272bba7d11c85414d48cf53ac8e3 200 6.770 ms - 506
info: - &gt; POST / wd / hub / session {&#34; desiredCapabilities&#34;:{&#34; javascriptEnabled&#34;:true,&#34; device&#34;:&#34; Android&#34;,&#34 ; platformName&#34;:&#34; Android和#34;&#34; DEVICENAME&#34;:&#34; d5cb5478&#34;&#34; browserName&#34;:&#34;铬&#34; &#34; platformVersion&#34;:&#34; 5.0.1&#34;&#34; browserVersion&#34;:&#34; 43.0.2357.93&#34;}}
错误:无法启动Appium会话,错误是:错误:请求新会话但其中一个正在进行中
所以从这里我可以看到,当我已经开始新会议时,它试图开始一个新的会议,但我无法弄清楚原因!
答案 0 :(得分:1)
所以这里是如何解决特定于Appium的问题的一半 - 我的NullReferenceException
没有答案。
当您尝试启动Appium WebDriver的端口已被使用时,会导致Appium错误。
您可以$telnet ip port
找出您需要杀死的Process ID
。
new Uri(TestServers.WindowsServer);
返回的值来找到地址/端口。退出所有模拟器
获得PID
后,您就可以$kill -9 pid
正常启动Appium服务器。
如果您经常遇到此问题,可能是因为您的脚本在没有退出Appium WebDriver的情况下结束。
通常,您将WebDriver(driver.quit()
)的拆解代码放在测试的@After
部分或基础TestCase
类中。
我看到你有一个拆解部分 - 所以也许你在上一次会议期间陷入了这种糟糕的状态?无论哪种方式,手动修复都可以让您恢复正常工作。