编辑:花了一周的时间,我最终找到了问题所在,主要是因为纯运气和另一个具有更具体修复方法的错误。 问题出在我制作的connStr上,由于某种原因,在这台机器上运行时会随机出现“System.ArgumentException: Keyword not supported: 'datasource'.”的错误。然后我发现解决方法是将connStr重命名如下:
connStr = @"server = (server name); Initial Catalog = AutoTestDB; Integrated Security = true";
如果您像我一样遇到此错误,请尝试使用该连接方法。目前,我正在使用Katalon自动化测试进行自动化测试,其本质上是Chrome的Selenium,但当我尝试将测试结果添加到我们的测试结果数据库中时,SQL异常"A network-related or instance-specific error occurred while establishing a connection to SQL Server."就会不断出现。 TCP/IP已打开,防火墙和远程连接也都已开启,我在运行带有SQL连接的数据库时也一直保持SQL-SMS开启状态。
然而,只有当我使用某个特定机器访问存储在机器内部的数据库时,才会出现这种情况,在使用其他任何机器时都可以正常工作。我能想到的这台机器唯一的区别就是使用了SQL Express,而我使用的所有其他机器都装有完整版本的Microsoft SQL-SMS-17。
这确实是一个"它在我的机器上可行"的真实案例,除了这台机器是唯一无法运行此代码的机器,唯一的区别是它使用了应该在\\SQLExpress中列出的SQL Express。
下面是使用SQL连接对C#代码进行编辑,并将其值插入到数据库中已有的表格中:
public void testDBAdd(String testName, Boolean pass, String testComment)
{
SqlConnection con;
SqlDataAdapter daAutoTest;
DataSet dsAutoTestDB = new DataSet();
SqlCommandBuilder cmdBAutoTest;
String connStr, sqlAutoTest;
connStr = @"datasource = .\\sqlexpress; Initial Catalog = AutoTestDB; Integrated Security = true";
con = new SqlConnection(connStr);
sqlAutoTest = @"SELECT * FROM TestResults";
daAutoTest = new SqlDataAdapter(sqlAutoTest, connStr);
cmdBAutoTest = new SqlCommandBuilder(daAutoTest);
daAutoTest.FillSchema(dsAutoTestDB, SchemaType.Source, "AutoTest");
daAutoTest.Fill(dsAutoTestDB, "AutoTest");
foreach (DataRow drAutoTest in dsAutoTestDB.Tables["AutoTest"].Rows)
{
if (pass == true && drAutoTest["testName"].ToString() == testName)
{
drAutoTest.BeginEdit();
drAutoTest["testName"] = testName;
drAutoTest["testResult"] = 1;
drAutoTest["testComment"] = testComment;
drAutoTest.EndEdit();
daAutoTest.Update(dsAutoTestDB, "AutoTest");
}
else if (pass == false && drAutoTest["testName"].ToString() == testName)
{
drAutoTest.BeginEdit();
drAutoTest["testName"] = testName;
drAutoTest["testResult"] = 0;
drAutoTest["testComment"] = "Exception: " + testComment;
drAutoTest.EndEdit();
daAutoTest.Update(dsAutoTestDB, "AutoTest");
}
}
}
这段代码运行实际测试并收集它是否由于存在特定元素而通过或失败,例如当用户登录并单击一个按钮时,是否显示了某个页面。
public void settingTest<TestNumber>()
{
IWebDriver driver = new ChromeDriver();
ChromeOptions options = new ChromeOptions();
options.AddArguments("--start-maximized");
driver = new ChromeDriver(options);
String testName = "<Test Number>", testComment = "";
Boolean pass = false;
try
{
settingsLogin(driver);
settingsClick(driver);
Assert.IsTrue(driver.FindElement(ElementLocator).Displayed);
if (driver.FindElement(ElementLocator).Displayed == true)
{
testComment = "Pass";
pass = true;
testDBAdd(testName, pass, testComment);
}
}
catch (Exception ex)
{
testComment = "" + ex.TargetSite + "" + ex.Message;
testDBAdd(testName, pass, testComment);
}
finally
{
driver.Close();
}
}