سنتابع في هذه المقالة مقالتنا السابقة التطوير المقاد بالاختبار – I

التعامل مع مربعات حوار الـ IE

في مستعرض الـ IE باستطاعتك فتح النوافذ وصناديق الحوار (WatiN تدعوهم صناديق حوار HTML ) باستخدام التابع window.showModelessDialog(…) بالإضافة إلى window.open(…) . إن هذه النوافذ تحتاج إلى معالجة خاصة في WatiN فإذا أردت الوصول اليها ليس باستطاعتك استخدام أصناف WatiN.Core.IE بل عليك استخدام WatiN.Core.HtmlDialog . كما قلنا سابقاً لا نستطيع لا نستطيع اسخدام أصناف WatiN مباشرة ضمن الاختبار. نحن صممنا صنف الواجهة الرئيسية وأصناف موروثة منه كطبقة مساعدة بين نص الاختبار البرمجي و WatiN . على كل حال الواجهة تستخدم داخلياً WatiN.Core.IE ولا يمكن استخدامها من أجل نوافذ HTML. ولذلك علينا بناء صنف مساعد آخر لهذه المهمة:

إن مخطط UML هذا يظهر صنف النافذة(Dialog) والصنف الموروث منه. لاحظ أن صنف الـ Dialog  يستخدم صنف HtmlDialog  من WatiN بدلاً من IE.

صنف الـ Dialog مشابه لما يلي:

Copy

1

private abstract class Dialog : IDisposable

2

{

3

    protected HtmlDialog dialog { get; private set; }

4

5

    public Dialog(Screen parentScreen, string url)

6

    {

7

        dialog = parentScreen.ie.HtmlDialog(Find.ByUrl(url), 2);

8

        if (this is IAssertable)

9

            ((IAssertable)this).AssertControls();

10

    }

11

12

    public void Dispose()

13

    {

14

        dialog.Close();

15

        GC.SuppressFinalize(this);

16

    }

17

}

هذا اختبار لرابط “Help” مثلاً:

Copy

1

[TestMethod()]

2

public void Overview_Help()

3

{

4

    using (var screen = new OverviewScreen())

5

    {

6

        screen.HelpLink.ClickNoWait();

7

        using (var help = new HelpScreen(screen)) { };

8

    }

9

}

لاحظ أننا استخدمنا ClickNoWait بدلاً من Click  هنا. Click داخلياً تستدعي WaitForComplete التي تنتظر الانترنت اكسبلورر لإخبارها بانتهائه من معالجة الطلب. على كل حال، Click سوف تنتظر بلا نهاية لأن نافذة جديدة فقد فتحت. ClickNoWait لاتنتظر وهي الوظيفة التي يجب اختيارها في هذه الحالة.

Copy

1

[TestMethod]

2

public void AddEntry_Launch()

3

{

4

    using (var overviewScreen = new OverviewScreen())

5

    {

6

        overviewScreen.AddNewLink.ClickNoWait();

7

        using (var screen = new AddEntryScreen())

8

        {

9

            // Check that combo boxes contain the correct number of items

10

            Assert.AreEqual(db.Projects.Count(),

11

            screen.ProjectCode.AllContents.Count);

12

            Assert.AreEqual(db.TaskTypes.Count(), screen.TaskType.AllContents.Count);

13

            Assert.AreEqual(db.Users.Count(), screen.Users.AllContents.Count);

14

        }

15

    }

16

}

التعامل مع رسائل تأكيد JavaScript

هنالك موضوع مهم أخر هو التعامل مع رساءل تأكيد JavaScript . وفي حالتنا “Add New” تفتح رسالة تأكيد (Box) ، إذا ضغط المستخدم على زر “Cancel”.

 تؤمن WatiN صنفين للتعامل مع رسائل التأكيد:

  • ConfirmDialogHandler
  • UseDialogOnce

في مثالنا يمكنك رؤية كيفية استخدامها ضمن الإجرائية AddEntry_CancelYes :

Copy

1

[TestMethod]

2

public void AddEntry_CancelYes()

3

{

4

    using (var overviewScreen = new OverviewScreen())

5

    {

6

        // remember number of records before delete

7

        // (just to keep it simple; not a good idea if tests

8

        // are running simulateously)

9

        var numberOfTimeTrackingRecords = db.TimeTrackings.Count();

10

11

        overviewScreen.AddNewLink.ClickNoWait();

12

        using (var screen = new AddEntryScreen())

13

        {

14

            // fill in test data

15

            screen.EnterTestData();

في الحالة الأولى نحن نحاكي الضغط على الزر “Cancel” في رسالة التأكيد. على المستخدم البقاء على واجهة “Add new” في هذه الحالة.

Copy

1

// click cancel and then NO -> must return to dialog

2

var confirm = new ConfirmDialogHandler();

3

using (new UseDialogOnce(screen.ie.DialogWatcher, confirm))

4

{

5

    screen.CancelLink.ClickNoWait();

6

    confirm.WaitUntilExists();

7

    confirm.CancelButton.Click();

8

    screen.ie.WaitForComplete();

9

}

في الحالة الثانية نحن نحاكي الضغط على الزر “OK” في رسالة التأكيد. على المستخدم العودة لواجهة “Overview” .

Copy

1

// click cancel and then YES -> must return to “Overview” screen

2

using (new UseDialogOnce(screen.ie.DialogWatcher, confirm))

3

{

4

    screen.CancelLink.ClickNoWait();

5

    confirm.WaitUntilExists();

6

    confirm.OKButton.Click();

7

    overviewScreen.ie.WaitForComplete();

8

9

    // make sure nothing changed after cancel

10

    Assert.AreEqual(numberOfTimeTrackingRecords,

11

    db.TimeTrackings.Count());

12

    Assert.AreEqual(numberOfTimeTrackingRecords,

13

    overviewScreen.ResultGrid.TableRows.Length – 1);

14

}

الخلاصة: 

الآن انتهى تطبيقنا ونجحت كل الاختبارات.