Selenium 2 WebDriver - Chrome - الحصول على القيمة من مربع نص يتم تعيينه عبر JavaScript

StackOverflow https://stackoverflow.com/questions/3767217

  •  04-10-2019
  •  | 
  •  

سؤال

أنا أستخدم Selenium 2 (آخر إصدار من GoogleCode) ولديه إطلاق النار على Chrome والذهاب إلى عنوان URL.

عندما يتم تحميل الصفحة بعض JavaScript ينفذ لتعيين قيمة مربع النص.

أخبرها أن تجد مربعًا نصًا بواسطة معرف يفعله ولكنه لا يحتوي على القيمة داخله (إذا كنت ترمز إلى قيمة تجدها).

بالنظر إلى pagesource eg console.writeline (driver.pagesource) ؛ يظهر HTML ومربع النص فارغ.

لقد حاولت استخدام:

Driver.FindElement (بواسطة .ed ("txtboxid") للحصول على العنصر وهذا أيضًا لا يجلب القيمة.

لقد جربت أيضًا ChromeWebelement CWE = New ChromeWebelement (برنامج التشغيل ، "TxtBoxId") ؛ (الذي يشكو من البيانات التي لا معنى لها).

أي أفكار؟

جون

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

المحلول

السيلينيوم 2 ليس لديه وظائف انتظار مدمجة للعناصر في DOM. كان هذا هو نفس الشيء كما في السيلينيوم 1.

إذا كان عليك الانتظار لشيء يمكنك القيام به

  public string TextInABox(By by)
  {
    string valueInBox = string.Empty;
    for (int second = 0;; second++) {
      if (second >= 60) Assert.Fail("timeout");
      try
      {
        valueInBox = driver.FindElement(by).value;
        if (string.IsNullOrEmpty(valueInBox) break;
      }
      catch (WebDriverException)
      {}
      Thread.Sleep(1000);
    }
    return valueInBox;
  }

او هناك شيء ما على طول هذه الخطوط

نصائح أخرى

وأخيرا وجدت الجواب! هذا هو الرمز الذي يعمل بالنسبة لي

WebDriverWait wait = new WebDriverWait(_driver, new TimeSpan(0,0,60));
wait.Until(driver1 => _driver.FindElement(By.Id("ctl00_Content_txtAdminFind")));
Assert.AreEqual("Home - My Housing Account", _driver.Title);

ها هو مصدري!http://code.google.com/p/selenium/issues/detail؟id=1142

أستخدم WebDriver من خلال Ruby (Cucumber Watir-Webdriver ، في الواقع) ، وأميل إلى القيام بذلك:

  def retry_loop(interval = 0.2, times_to_try = 4, &block)
    begin
      return yield
    rescue
      sleep(interval)
      if (times_to_try -= 1) > 0
        retry
      end
    end
    yield
  end

ثم كلما كان لدي محتوى يظهر بسبب كتابة JavaScript أو أي شيء آخر ، فأنا فقط لفه في إعادة المحاولة مثل ذلك:

    retry_loop do #account for that javascript might fill out values
      assert_contain text, element
    end

كما ستلاحظ أنه لا توجد عقوبة أداء إذا كانت موجودة بالفعل. الحالة العكسية (التحقق من أن شيء ما غير موجود) ستحتاج دائمًا إلى الوصول إلى المهلة ، من الواضح. يعجبني الطريقة التي تحافظ على تفاصيلها معبأة في الطريقة ورمز الاختبار نظيفًا.

ربما يمكنك استخدام شيء مشابه في C ++؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top