Search code examples
c#multithreadingwatin

Watin multithreading issue


I have a problem in my application, written in c# using WatiN. The application creates few threads,and each thread open browser and the same page.
The page consist of HTML select element:
example of select element
and a submit button.
The browsers should select a specific option and click on the submit button at the same time but instead they do it "one by one". Here is the main code lines:

[STAThread]
static void Main(string[] args)
{ 

    for (int i = 0; i < numOfThreads;i++ )
    {
        var t = new Thread(() => RealStart(urls[i]));
        t.SetApartmentState(ApartmentState.STA);
        t.IsBackground = true;
        t.Start();
    }
}

private static void RealStart(string url)
    {
        using (var firstBrowser = new IE())
        {                
            firstBrowser.GoTo(url);
            firstBrowser.BringToFront();           
            OptionCollection options = firstBrowser.SelectList("Select").Options;
            options[1].Select();
            firstBrowser.Button(Find.ByName("Button")).Click();
            firstBrowser.Close();
        }
    }

What is the cause of the "one by one" selection instead of simultaneously selection?


Solution

  • Solution:
    After a long research I gave up using WatiN for this porpuse.
    Instead, I have created HttpWebRequest and post it to the specific URL.
    Works Like a charm:

    HttpWebRequest httpWReq = (HttpWebRequest)WebRequest.Create("http://domain.com/page.aspx");
    ASCIIEncoding encoding = new ASCIIEncoding();
    string postData = "username=user";
    postData += "&password=pass";
    byte[] data = encoding.GetBytes(postData);
    httpWReq.Method = "POST";
    httpWReq.ContentType = "application/x-www-form-urlencoded";
    httpWReq.ContentLength = data.Length;
    using (Stream stream = httpWReq.GetRequestStream())
    {
       stream.Write(data,0,data.Length);
    }
    HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse();
    string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
    

    I send those requests simultaneously, by creating a Thread for each request.