2012-10-02 37 views
6

के साथ गतिशील रूप से लोड की गई सामग्री का परीक्षण करें मैं एक ऐसे सिस्टम पर काम कर रहा हूं जिसमें वेब आधारित फ्रंटेंड है जिसे मैं सेलेनियम के साथ परीक्षण कर रहा हूं। एक पृष्ठ पर सामग्री को स्क्रॉल करते समय गतिशील रूप से लोड किया जाता है (शायद आप जानते हैं कि फेसबुक की मित्र सूची से), क्योंकि यह आवश्यकताओं में से एक है।सेलेनियम वेब चालक

सेलेनियम वेबड्राइवर (मैं क्रोम का उपयोग करता हूं) के साथ स्क्रॉलिंग जावास्क्रिप्ट के माध्यम से कोई समस्या नहीं होनी चाहिए। लेकिन गतिशील रूप से जोड़ा गया सामग्री के साथ एक समस्या है। मैं वेब तत्वों को उन तत्वों को कैसे ढूंढ सकता हूं?

मैं नीचे स्क्रॉल करने के लिए निम्न जब तक कोई और अधिक सामग्री भरी हुई है की कोशिश की:

int oldSize = 0; 
int newSize = 0; 
do { 
    driver.executeScript("window.scrollTo(0,document.body.scrollHeight)"); 
    newSize = driver.findElementsBy(By.cssSelector("selector").size(); 
} while(newSize > oldSize); 

लेकिन हालांकि और पहली बार नीचे पृष्ठ स्क्रॉल कुछ अब सामग्री ठीक से भरी हुई है, वे चालकों द्वारा नहीं मिलेगा 'findElements द्वारा (द्वारा) समारोह।

क्या किसी ने कभी इस समस्या का सामना किया है ?? अगर कोई मुझे इसके लिए समाधान ढूंढने में मदद कर सकता है तो मुझे बहुत खुशी होगी!

सादर, बेंजामिन

+0

मैं (ajax के माध्यम से आदेश घटकों के लोड होने में नीचे स्क्रॉल करना होगा)। जैसा कि मैंने कहा था कि मैं क्रोमैड्रिवर का उपयोग करता हूं। –

उत्तर

0

मैं इस समस्या लोड होने तक गतिशील सामग्री के लिए इंतज़ार कर रहा है लगता है। खोजने के ठीक पहले 3 सेकंड प्रतीक्षा करने का प्रयास करें? सी # में कोड थ्रेड होगा। नींद (3000);

+0

अच्छा विचार, इसे आजमाया ... findElements अभी भी उन तत्वों को बचाता है जो –

+0

@ बेंजामिन पर शुरू से लोड किए गए थे: क्या आपने 5 सेकंड की तरह लंबे समय तक प्रयास किया है? क्या आप सेलेनियमइड में सत्यापित कर सकते हैं कि जब तत्व मौजूद होता है तो सीएसएस चयनकर्ता काम करता है?मैं आईडीई में एक परीक्षण करूँगा, लेकिन स्क्रॉल अनुकरण करना मुश्किल है - आप keyPress को आजमा सकते हैं xpath =/html/body/| 34 (कीकोड 34 पेजडाउन है), फिर प्रतीक्षा करेंऑरमेंटमेंट ... – pellucid

+0

मैं सेलेनियमइड के साथ काम नहीं करता ... –

4

मैं अपेक्षित कैंडिटन्स के साथ WebDriverWait का उपयोग करने की अनुशंसा करता हूं। विशेष रूप से धाराप्रवाह इंतजार का उपयोग कर http://seleniumhq.org/docs/04_webdriver_advanced.html

+0

+1। बुरा दृष्टिकोण नहीं है लेकिन मुझे लगता है कि इस मामले के लिए मुझे स्पष्ट प्रतीक्षा का चयन करें। –

1

कोशिश:

//scroll down with Javascript first 
WebDriverWait wait = new WebDriverWait(driver, 30); 
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("selector"))); 
//interact with your element 
element.click() 

मार्गदर्शन सेलेनियम आधिकारिक पेज द्वारा प्रदान की पर एक नजर डालें। मुख्य विशेषता है:

प्रतीक्षा इंटरफ़ेस का कार्यान्वयन जिसमें फ्लाई पर कॉन्फ़िगर किया गया समय और मतदान अंतराल हो सकता है। प्रत्येक FluentWait उदाहरण किसी शर्त की प्रतीक्षा करने के लिए अधिकतम समय को परिभाषित करता है, साथ ही साथ आवृत्ति को जांचने के लिए आवृत्ति। इसके अलावा, उपयोगकर्ता प्रतीक्षा के दौरान विशिष्ट प्रकार के अपवादों को अनदेखा करने के लिए प्रतीक्षा को कॉन्फ़िगर कर सकता है, जैसे पेज पर किसी तत्व की खोज करते समय NoSuchElementExceptions।

public WebElement fluentWait(final By locator){ 
     Wait<WebDriver> wait = new FluentWait<WebDriver>(driver) 
       .withTimeout(30, TimeUnit.SECONDS) 
       .pollingEvery(5, TimeUnit.SECONDS) 
       .ignoring(NoSuchElementException.class); 

     WebElement foo = wait.until(
new Function<WebDriver, WebElement>() { 
      public WebElement apply(WebDriver driver) { 
         return driver.findElement(locator); 
       } 
       } 
); 
          return foo;    }  ; 

वर्णित विधि आपको वेब तत्व देता है जिसके साथ आप काम कर सकते हैं। तो दृष्टिकोण निम्न हो: 1) आपको स्क्रॉल करने के बाद उन तत्वों के चयनकर्ताओं को ढूंढने की आवश्यकता है जिन्हें आप प्रस्तुत करना चाहते हैं।

String cssSelector = "blablabla" 

2) जे एस 3)

WebElement neededElement = fluentWait(cssSelector); 
neededElement.click(); 
//neededElement.getText().trim(); 

आप धाराप्रवाह प्रतीक्षा के बारे में अधिक जानकारी प्राप्त कर सकते के साथ नीचे स्क्रॉल here

+1

मेरे पास केवल एक प्रश्न है - जावा में कोई नया फ़ंक्शन कैसे कार्य करता है क्योंकि कोई फ़ंक्शन टेम्पलेटिंग नहीं है? उपरोक्त उदाहरण सेलेनियम जावाडॉक्स में भी उल्लेख किया गया है, लेकिन जावैक मुझे प्रतीक नहीं ढूंढ पाएगा: कक्षा समारोह - मैं समझना चाहता हूं कि मुझे बल्ले से सीधे ऊपर के दृष्टिकोण का उपयोग करने में सक्षम बनाने के लिए मुझे किस भाग में याद आया है। – Vatsala

+0

क्या आप मुझे एक लिटिल बिट स्पष्टीकरण दे सकते हैं: जावा में फ़ंक्शन टेम्पलेटिंग कहने का आप क्या कहते हैं? –

+1

मुझे यकीन नहीं है कि आप 'फ़ंक्शन टेम्पलेटिंग' कह रहे हैं लेकिन नया फ़ंक्शन <वेबड्राइवर, वेबलेमेंट>() {अज्ञात वर्ग का उदाहरण पर पास किया गया है। फ़ंक्शन को सेलेनियम एपीआई में परिभाषित किया गया है। तक (com.google.common.base.Function isTrue) बार बार जब तक दिए गए कार्य करने के लिए इस उदाहरण के इनपुट मूल्य लागू होता है निम्न में से एक होती है: फ़ंक्शन न अशक्त और न ही झूठा, समारोह एक unignored अपवाद फेंकता है, टाइमआउट की समयसीमा समाप्त हो जाती है, वर्तमान थ्रेड किसी भी शिकायत के मुद्दों में बाधित है - ऐसा लगता है कि आपने आईडीई सेटिंग्स को ठीक से सेट नहीं किया है (IMHO) –