Selenium 2 WebDriver - Chrome - الحصول على القيمة من مربع نص يتم تعيينه عبر JavaScript
-
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 ++؟