مشكلة إرفاق واتين بـ IE
-
26-09-2019 - |
سؤال
أنا أجرب Watin لاختبار واجهة المستخدم الخاصة بنا ، يمكنني إجراء اختبارات للعمل ، لكن لا يمكنني الحصول على إغلاق بعد ذلك.
أحاول إغلاق IE في رمز تنظيف الفصل الخاص بي ، باستخدام مثال Watin IestaticinstanceHelper تقنية.
يبدو أن المشكلة تربط بخيط IE ، الذي يخرج:
_instance = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd));
(_iehwnd هو مقبض IE المخزّن عندما يتم إطلاق IE لأول مرة.)
هذا يعطي الخطأ:
طريقة تنظيف الفئة class1.myclasscleanup فشل. رسالة الخطأ: watin.core.exceptions.browsernotfoundException: لا يمكن العثور على قيد مطابقة نافذة IE: السمة "hwnd" تساوي '1576084'. انتهت عملية البحث بعد "30" ثانية .. تتبع المكدس: في watin.core.native.internetexplorer.attachtoieHelper.find (القيد Findby ، int32 timeout ، WaitforComplete)
أنا متأكد من أنني يجب أن أفتقد شيئًا واضحًا ، هل حصل أي شخص على أي أفكار حول هذا؟ شكرًا
للاكتمال ، يبدو المساعد الثابت مثل هذا:
public class StaticBrowser
{
private IE _instance;
private int _ieThread;
private string _ieHwnd;
public IE Instance
{
get
{
var currentThreadId = GetCurrentThreadId();
if (currentThreadId != _ieThread)
{
_instance = IE.AttachTo<IE>(Find.By("hwnd", _ieHwnd));
_ieThread = currentThreadId;
}
return _instance;
}
set
{
_instance = value;
_ieHwnd = _instance.hWnd.ToString();
_ieThread = GetCurrentThreadId();
}
}
private int GetCurrentThreadId()
{
return Thread.CurrentThread.GetHashCode();
}
}
ويبدو رمز التنظيف مثل هذا:
private static StaticBrowser _staticBrowser;
[ClassCleanup]
public static void MyClassCleanup()
{
_staticBrowser.Instance.Close();
_staticBrowser = null;
}
المحلول 3
تم إصلاح هذا بنفسي عن طريق إلقاء MSTEST واستخدام MBUnit بدلاً من ذلك. لقد وجدت أيضًا أنني لست بحاجة إلى استخدام أي من الأشياء IestaticinstanceHelper أيضًا ، فقد نجحت فقط.
نصائح أخرى
المشكلة هي أنه عندما تنفذ MSTEST الطريقة مع [ClassCleanup]
السمة ، سيتم تشغيلها على موضوع ليس جزءًا من ستا.
إذا قمت بتشغيل الكود التالي ، فيجب أن يعمل:
[ClassCleanup]
public static void MyClassCleanup()
{
var thread = new Thread(() =>
{
_staticBrowser.Instance.Close();
_staticBrowser = null;
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
}
يذكر موقع واتين باختصار أن واتين لن يعمل مع المواضيع وليس في STA هنا لكن ليس من الواضح ذلك [TestMethod]
يركض في STA بينما مثل أساليب مثل [ClassCleanup]
و [AssemblyCleanupAttribute]
لاتفعل.
بشكل افتراضي عندما يتم تدمير كائن IE ، فإنها تتوافق مع المتصفح.
قد يحاول رمز التنظيف الخاص بك العثور على متصفح يغلق بالفعل ، وهذا سبب وجود خطأ.