ここにはたくさんのコードがあるので、それが何をすべきかを簡単に説明しましょう。
予想される流れ:
GetScenarios();
SQL 接続を開き、while
ループを開始してScenarios
データベースをループします。- データベース内の最初のアイテムが選択されたら、それに対して実行
TestScenarios()
します。 TestScenarios()
はアイテムの XML 値の一部を読み取り、そのうちの 1 つが であり、コントロールでUrl
を開きます。Url
WebBrowser
click
その Web ページが開かれると、ページ上の要素を (テスト) するために、一部の Javascript が挿入されて呼び出されます。- if ステートメント
TestUrl.Equals(expected)
は を返しtrue
ます。
new Action
javascript を挿入するために a を呼び出すときに問題が発生します。
を返すTestUrl.Equals(expected)
必要があるかどうかをテストする JavaScript 関数ですtrue
が、何らかの奇妙な理由で、プログラムをステップ実行すると、すべてが 2 回実行されているようにif
見えfalse
ますtrue
。
これはスレッド/コード フローの問題だと思いますが、どこにあるのかわかりません。関数の後に実行されるすべてのコードをNavigate()
関数内に配置することを考えていましたが、その関数内で変数WebBrowserDocumentCompleted
を渡す方法がわからないため、それがどのように機能するかわかりません。
public void GetScenarios()
{
new Thread(() =>
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT * FROM Scenarios WHERE IsEnabled='1'", conn))
{
SqlDataReader reader = cmd.ExecuteReader();
if (reader.HasRows)
{
AutoResetEvent signal = new AutoResetEvent(false);
while (reader.Read())
{
/* Perform a test on the selected scenario
* (can do different types of tests)
* */
TestScenarios(reader, cmd, signal, Url, HasSucceeded);
}
reader.Close();
}
}
}
}).Start();
}
/// <summary>
/// Waits for WebBrowser to complete loading the page
/// </summary>
private void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs Url)
{
((AutoResetEvent)((WebBrowser)sender).Tag).Set();
}
/// <summary>
/// Goes to specified Url
/// Performs a test on the selected scenario
/// </summary>
public int TestScenarios(SqlDataReader reader, SqlCommand cmd, AutoResetEvent signal, string Url, int HasSucceeded)
{
// Read XML
string testType = "";
string testElement = "";
string expected = "";
SqlXml sqlXml = reader.GetSqlXml(1);
using (var xmlreader = sqlXml.CreateReader())
{
// Read XML values
}
// Navigate to Url
Action action = () =>
{
webBrowser2.Tag = signal;
webBrowser2.Navigate(Url);
webBrowser2.DocumentCompleted -= WebBrowserDocumentCompleted;
webBrowser2.DocumentCompleted += WebBrowserDocumentCompleted;
};
webBrowser2.Invoke(action);
signal.WaitOne();
// If/else to determine type of test and run test
if (testType == "Click")
{
webBrowser2.Invoke(new Action(() =>
{
HtmlElement head = webBrowser2.Document.GetElementsByTagName("head")[0];
HtmlElement testScript = webBrowser2.Document.CreateElement("script");
IHTMLScriptElement element = (IHTMLScriptElement)testScript.DomElement;
element.text = "function TestClick() { $('" + testElement + "')[0].click(); }";
head.AppendChild(testScript);
webBrowser2.Document.InvokeScript("TestClick");
string TestUrl = webBrowser2.Url.AbsoluteUri;
if (TestUrl.Equals(expected))
{
HasSucceeded = 1;
}
else
{
// No test
}
}));
}
return HasSucceeded;
}