سؤال

متطلباتي - أفتح مثيلًا لـ Internet Explorer برمجيًا. بعد ذلك ، أحصل على htmldocument وأبحث عن حقل إدخال (مربع نص) ثم ضبط قيمته.

    HTMLDocument oDoc = new mshtml.HTMLDocumentClass();
    oDoc = (HTMLDocument)oBrowser.Document;

    HTMLInputElement txtbox1 = (HTMLInputElement)oDoc.all.item("login",0);
    txtbox1.setAttribute("value", "test_user_name", 0);
    //txtbox1.value = "test_user_name";

يعمل الكود الخاص بي بشكل جيد حتى يتم البحث عن حقل الإدخال. المشكلة في مكان ما في الكود الذي نشرته أعلاه. أحصل على كائن htmldocument ، ثم أبحث عن htmlinputelement باسم "تسجيل الدخول". هنا ، أواجه تناقضًا - لم يتم التعرف على مربع النص في بعض الأحيان ، وهكذا عندما يصل إلى txtbox1.SetAttribute أو txtbox1.value ثم NullReferenceException هذا خطئ. لكن هذا لا يحدث دائمًا. في بعض الأحيان لا يتم طرح الاستثناء ويعمل الرمز بشكل جيد. لقد حاولت تصحيح الأخطاء من خلال الكود ، لكن الخطأ لا يظهر أبدًا عندما أقوم بتصحيح الكود !!

أنا غير قادر على معرفة ما يمكن أن يكون السبب؟ ما الذي يسبب هذا التناقض؟ أيه أفكار؟

هل كانت مفيدة؟

المحلول

هل أنت متأكد من أن الصفحة محملة بالكامل عند تشغيل الرمز الخاص بك؟ إذا لم يكن الأمر كذلك ، فقد لا تتضمن DOM عن عنصر التحكم الخاص بك في الوقت الذي تقوم فيه بتنفيذ التعليمات البرمجية الخاصة بك.

يجب عليك إضافة حدث WebBrowser1.DocumentCompleted ثم تنفيذ الكود في معالج الحدث المكتمل للتأكد من إنشاء DOM بالكامل.

أود أن أوصي أيضًا باستخدام WebBrowser Control من System.windows.forms بدلاً من AxwebBrowser و MSHTML. هذا إذا كنت تستضيف المتصفح في نافذة خاصة بك. لقد واجهت بعض المشكلات مع MSHTML في الماضي ، وخاصة فيما يتعلق بالتركيز على الأحداث.

webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted)
.
.
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    var doc = webBrowser1.Document;
    var txtBox1 = doc.All["login"];
    txtBox1.SetAttribute("value", "test_user_name");
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top