मुझे HTML को मतदान करने का आपका विचार पसंद है जब तक कि यह स्थिर न हो। मैं इसे अपने समाधान में जोड़ सकता हूं। निम्नलिखित दृष्टिकोण C # में है और jQuery की आवश्यकता है।
मैं एक SuccessFactors (SaaS) परीक्षण परियोजना के लिए डेवलपर हूं जहां वेब पेज के पीछे डेवलपर्स या डोम की विशेषताओं पर हमारा कोई प्रभाव नहीं है। सास उत्पाद संभावित रूप से अपने अंतर्निहित DOM डिज़ाइन को वर्ष में 4 बार बदल सकता है, इसलिए शिकार स्थायी रूप से सेलेनियम के साथ परीक्षण करने के लिए मजबूत, प्रदर्शन करने के तरीकों पर है (जिसमें सेलेनियम के साथ परीक्षण नहीं किया गया है, जहां ब्ली!)
यहां मैं "पेज रेडी" के लिए उपयोग करता हूं। यह वर्तमान में मेरे सभी परीक्षणों में काम करता है। इसी दृष्टिकोण ने कुछ साल पहले एक बड़े इन-हाउस जावा वेब ऐप के लिए भी काम किया था, और जब मैंने प्रोजेक्ट छोड़ा था उस समय एक साल से अधिक समय तक मजबूत रहा था।
Driver
वेबड्राइवर उदाहरण है जो ब्राउज़र के साथ संचार करता है
DefaultPageLoadTimeout
टिक्स में एक टाइमआउट मान (100 टिक प्रति टिक)
public IWebDriver Driver { get; private set; }
// ...
const int GlobalPageLoadTimeOutSecs = 10;
static readonly TimeSpan DefaultPageLoadTimeout =
new TimeSpan((long) (10_000_000 * GlobalPageLoadTimeOutSecs));
Driver = new FirefoxDriver();
इस प्रकार, विधि में प्रतीक्षा के क्रम पर ध्यान दें PageReady
(सेलेनियम दस्तावेज़ तैयार, अजाक्स, एनिमेशन), जो समझ में आता है यदि आप इसके बारे में सोचते हैं:
- कोड वाले पेज को लोड करें
- Ajax के माध्यम से कहीं से डेटा लोड करने के लिए कोड का उपयोग करें
- संभवतः एनिमेशन के साथ डेटा प्रस्तुत करते हैं
आपके DOM तुलना दृष्टिकोण की तरह कुछ का इस्तेमाल मजबूती की एक और परत जोड़ने के लिए 1 और 2 के बीच किया जा सकता है।
public void PageReady()
{
DocumentReady();
AjaxReady();
AnimationsReady();
}
private void DocumentReady()
{
WaitForJavascript(script: "return document.readyState", result: "complete");
}
private void WaitForJavascript(string script, string result)
{
new WebDriverWait(Driver, DefaultPageLoadTimeout).Until(
d => ((IJavaScriptExecutor) d).ExecuteScript(script).Equals(result));
}
private void AjaxReady()
{
WaitForJavascript(script: "return jQuery.active.toString()", result: "0");
}
private void AnimationsReady()
{
WaitForJavascript(script: "return $(\"animated\").length.toString()", result: "0");
}