handling iframes using selenium webdriver switchto method
अल्फा और बीटा परीक्षण क्या है
सेलेनियम वेबड्राइवर का उपयोग करते हुए iFrames को हैंडल करना: प्रैक्टिकल उदाहरणों के साथ हाथों पर ट्यूटोरियल
iFrame (इनलाइन फ़्रेम) एक HTML दस्तावेज़ है जो किसी अन्य HTML दस्तावेज़ में एम्बेडेड है।
iFrames आमतौर पर एक वेब पेज के भीतर विज्ञापन प्रदर्शित करने के लिए उपयोग किया जाता है। iFrames HTML टैग का उपयोग करके स्पष्ट रूप से HTML दस्तावेज़ पर उल्लेख किया गया है
यह ट्यूटोरियल आपकी आसान समझ के लिए संबंधित कोड उदाहरणों के साथ सेलेनियम में आइफ्रेम को संभालने के बारे में आप सभी को समझाएगा।
=> आसान सेलेनियम प्रशिक्षण श्रृंखला के माध्यम से पढ़ें।
आप क्या सीखेंगे:
- सेलेनियम का उपयोग iFrames को संभालना
- मार्च 2020 पर अद्यतन
- निष्कर्ष
सेलेनियम का उपयोग iFrames को संभालना
वेब पेज के भीतर एक आइफ्रेम को फ़ायरफ़ॉक्स ब्राउज़र में पहचाना जा सकता है यदि ’इस फ़्रेम’ नाम का विकल्प राइट-क्लिक विकल्पों पर प्रदर्शित होता है जैसा कि नीचे दिखाया गया है।
वैकल्पिक रूप से, हम यह भी सत्यापित कर सकते हैं कि स्रोत कोड को देखकर और टैग की खोज करके किसी वेब पेज में कोई iframes है या नहीं
List iframes = driver.findElements(By.tagName(“iframe”));
आइफ्रेम को संभालने के लिए सेलेनियम द्वारा प्रदान की गई विधियाँ
सेलेनियम iframes से आगे और पीछे स्विच करने के लिए निम्नलिखित अंतर्निहित तरीके प्रदान करता है।
- स्विचट.फ्रेम (int फ्रेमनंबर)
- switchTo.frame (स्ट्रिंग फ्रेमनाम)
- स्विचट.फ्रेम (वेबमेल फ्रेमवर्क)
- स्विचटो ()। डिफ़ॉल्टकंटेंट ()
# 1) switchTo.frame (int फ्रेमनंबर)
- यह विधि उपयोगकर्ताओं को फ्रेम आईडी का उपयोग करके एक विशेष फ्रेम में स्विच करने की अनुमति देती है।
- फ़्रेम नंबर एक शून्य-आधारित इंडेक्स वैल्यू है जिसका अर्थ है कि वेब पेज के पहले फ्रेम में इंडेक्स 0 है, दूसरे फ्रेम में इंडेक्स 1 है, और तीसरे फ्रेम में इंडेक्स 3 और इतने पर है।
- फ़्रेम नंबर को तत्व के फ़्रेम आईडी का उपयोग करके भी पहचाना जा सकता है। इसके द्वारा किया जा सकता है राइट क्लिक करें -> तत्व का निरीक्षण करें और iFrame खोजें। यदि किसी भी iFrames में कोई ID विशेषता है तो मान्य करें।
स्रोत कोड पर नमूना iframe तत्व जैसा कि नीचे उल्लेख किया गया है।
एक बार जब iFrame की आईडी की पहचान हो जाती है, तो हम नीचे के रूप में फ्रेम पर स्विच करने के लिए उसी का उपयोग कर सकते हैं।
उदाहरण:
Driver.switchTo.frame ('a077aa5e');
Driver.switchTo.frame (0);
- वर्तमान वेब पेज पर आवश्यक फ्रेम नहीं मिलने पर यह विधि NoSuchFrameException को फेंकती है।
# 2) switchTo.frame (स्ट्रिंग फ्रेमनाम)
- यह विधि उपयोगकर्ताओं को फ्रेम के डेवलपर-परिभाषित नाम का उपयोग करके एक विशेष फ्रेम में स्विच करने की अनुमति देती है।
- फ्रेम नाम को स्ट्रिंग पैरामीटर के रूप में माना जाने के लिए दोहरे उद्धरण चिह्नों के भीतर संलग्न करने की आवश्यकता है।
- वर्तमान वेब पेज पर आवश्यक फ्रेम नहीं मिलने पर यह विधि NoSuchFrameException को फेंकती है।
उदाहरण:
ऊपर वर्णित कोड में, फ्रेम आईडी और फ्रेम नाम दोनों एक ही मूल्य रखते हैं। नीचे दिए गए फ्रेम नाम का उपयोग करके फ्रेम में स्विच को पूरा किया जा सकता है:
Driver.switchTo.frame ('a077aa5e');
# 3) switchTo.frame (वेबइमेंट फ्रेमवर्क)
- यह विधि उपयोगकर्ताओं को वेब तत्व के स्थान के आधार पर एक फ़्रेम पर स्विच करने की अनुमति देती है।
- यह विधि NoSuchFrameException को फेंकता है जब वेब पेज पर आवश्यक फ्रेम मौजूद नहीं है और StaleElementReferenceException यदि वेब पेज पर प्रदर्शित फ्रेम सक्रिय नहीं है।
उदाहरण:
WebElement FrameElement = driver.findElement (By.id ('a077aa5e'));
Driver.switchTo.frame (फ्रेमइलमेंट);
# 4) स्विचटॉ ()। डिफॉल्टकंटेंट ()
- Iframes और पैरेंट पेज के बीच आगे-पीछे स्विच करने से driver.switchTo ()। DefaultContent () मेथड का इस्तेमाल करके हासिल किया जा सकता है।
- कृपया ध्यान दें कि Driver.switchTo ()। पैरेंटफ्रैम () विधि नाम के फ्रेम के बीच स्विच करने के लिए सेलेनियम में एक समान विधि है।
- Driver.switchTo ()। DefaultContent () और driver.switchTo (?) ParentFrame () के बीच का अंतर यह है कि पहला तरीका वेब पेज के फ्रेम की संख्या की परवाह किए बिना मुख्य वेब पेज पर नियंत्रण स्विच करता है, जबकि दूसरी विधि। वर्तमान फ्रेम के मूल फ्रेम पर नियंत्रण स्विच करता है।
उदाहरण:
मान लीजिए कि मूल वेब पेज p1 के भीतर i1, i2 और i3 नाम के तीन फ्रेम हैं। फ़्रेम i1, i2 और i3 एक दूसरे पर निर्भर हैं जिसका मतलब है कि एक फ्रेम दूसरे का माता-पिता होगा।
Driver.switchTo () का उपयोग करते हुए। DefaultContent () मेथड i3 पर विधि, वेब ड्राइवर नियंत्रण पैरेंट पेज, P1 पर जाता है। जबकि driver.switchTo ()। पैरेंटफ्रेम () मेथड i3 पर मेथड स्विच कंट्रोल को वापस i2 वगैरह पर स्विच करता है।
स्रोत कोड नमूना:
सेलेनियम में iframes का उपयोग करके स्वचालित होने का परीक्षण परिदृश्य नीचे दिया गया है:
- SoftwareTestingHelp.com वेबसाइट खोलें।
- सभी HTML तत्वों को आइफ्रेम टैग के साथ खोजें, iFrame की घटनाओं की संख्या की गणना करें और इसे एक कंसोल पर प्रिंट करें।
- फ़्रेम आईडी का उपयोग करके वेब पेज पर एक वैध फ्रेम पर स्विच करें और फ्रेम के स्रोत कोड को प्रिंट करें।
- वर्तमान ब्राउज़र विंडो बंद करें।
package Demo; import java.util.List; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; public class iFramesDemo { public static void main(String[] args) throws InterruptedException { System.setProperty('webdriver.gecko.driver','D:\Data_Personal\Demo \geckodriver-v0.23.0-win64\geckodriver.exe'); WebDriver driver = new FirefoxDriver(); driver.get('https://www.softwaretestinghelp.com/'); //Finding all iframe tags on a web page List elements = driver.findElements(By.tagName('iframe')); int numberOfTags = elements.size(); System.out.println('No. of Iframes on this Web Page are: ' +numberOfTags); // Switch to the frame using the frame id System.out.println('Switching to the frame'); driver.switchTo().frame('aswift_0'); // Print the frame source code System.out.println('Frame Source' +driver.getPageSource()); // Switch back to main web page driver.switchTo().defaultContent(); driver.quit(); } }
कोड आउटपुट:
वेबसाइट खोलें: https://www.softwaretestinghelp.com
Aswift_0 नामक फ़्रेम पर स्विच करें।
ग्रहण कंसोल विंडो पर वेब पेज पर iframes की संख्या प्रिंट करें।
फ्रेम पर स्विच करने के बाद ग्रहण कंसोल पर फ्रेम के स्रोत कोड को प्रिंट करें।
कोड स्पष्टीकरण:
- हम स्थानीय मशीन पर geckodriver.exe फ़ाइल पथ को इंगित करने के लिए System.setProperty विधि का उपयोग करके जेको ड्राइवर की एक वस्तु को आरम्भ कर रहे हैं।
- फिर हम WebDriver इंटरफ़ेस के माध्यम से FireFox ड्राइवर की एक वस्तु को इंस्टेंट कर रहे हैं।
- फ़ायरफ़ॉक्स ड्राइवर ऑब्जेक्ट का उपयोग करके, निम्न वेबपेज: https://www.softwaretestinghelp.com खोला गया है।
- अगले चरण में, हम वेब पेज पर प्रदर्शित होने वाले iframe तत्वों की संख्या की पहचान कर रहे हैं, उन्हें गिन रहे हैं और ग्रहण कंसोल पर iframe गिनती प्रदर्शित कर रहे हैं।
- फ़्रेम आईडी का उपयोग करते हुए, हम वेब पेज पर फ़्रेम पर स्विच कर रहे हैं। उपरोक्त मामले में, फ्रेम आईडी above aswift_0 ’है।
- एक बार हमने सफलतापूर्वक फ़्रेम पर स्विच कर लिया है, हम ग्रहण कंसोल पर फ्रेम के स्रोत कोड को प्रिंट कर रहे हैं।
- उसके बाद हम driver.switchTo () defaultContent () स्टेटमेंट का उपयोग करके मूल वेब पेज पर वापस आ रहे हैं और आखिरकार ड्राइवर का उपयोग करके वेब ड्राइवर का उदाहरण बंद कर रहे हैं। विधि का उपयोग करें।
सेलेनियम में फ़्रेम और आईफ्रेम के बीच अंतर
- एक फ़्रेम का उपयोग किसी पृष्ठ को कई खंडों में विभाजित करने के लिए किया जाता है, जिसमें प्रत्येक अनुभाग पर नई सामग्री होती है।
- क्रॉस-साइट स्क्रिप्टिंग समस्याओं से बचने के लिए, वेब पेज में बाहरी वेबसाइटों की सामग्री को एम्बेड करने के लिए एक iFrame का उपयोग किया जाता है।
- एक iFrame को फ्रेम से कम सुरक्षित माना जाता है, क्योंकि iFrame डेवलपर्स को तीसरे पक्ष की वेबसाइटों से सामग्री एम्बेड करने की अनुमति देता है। इस प्रकार, एक iframe को डेवलपर को उस सामग्री पर भरोसा करने की आवश्यकता होती है, जिसे उसने iframe में एम्बेड किया है।
- आज विकसित किए जा रहे अधिकांश वेब एप्लिकेशन पृष्ठ को विभाजित करने के लिए फ़्रेम का उपयोग नहीं करते हैं, बल्कि वे वेब पेज के भीतर बाहरी सामग्री जैसे विज्ञापनों को एम्बेड करने के लिए iframes का उपयोग करते हैं।
सेलेनियम में गतिशील फ्रेम्स को संभालना
- कुछ वेब पेजों में, फ्रेम आईडी और फ्रेम नाम जैसे फ़्रेम गुण वेब पेज पर गतिशील रूप से बदल सकते हैं, हालांकि, फ़्रेम की स्थिति समान रहेगी। ऐसे मामले में, हम किसी फ्रेम की विशिष्ट पहचान करने के लिए फ़्रेम आईडी या फ़्रेम नाम पर भरोसा नहीं कर सकते।
- हम उपयोग कर सकते हैं फ्रेम इंडेक्स ऐसे मामले में विशिष्ट रूप से फ्रेम की स्थिति के आधार पर फ्रेम की पहचान करें।
- कुछ मामलों में, पृष्ठ लोड होने पर हर बार फ्रेम आईडी मूल्य में परिवर्तन होता है, लेकिन एक स्थिर पाठ के साथ जो बदलता नहीं है। उदाहरण के लिए , iframes के लिए नीचे दिए गए कोड पर विचार करें।
उपरोक्त उदाहरण में, पाठ _ फ्रेम_ ’स्थिर रहता है जबकि प्रत्येक पृष्ठ लोड के साथ संख्यात्मक मूल्य बदलता है।
- हम नीचे दिए गए उपयोग से उपरोक्त फ्रेम को विशिष्ट रूप से पहचान सकते हैं XPath
// iframe [(@ id, 'फ्रेम')]
मार्च 2020 पर अद्यतन
फ़्रेम के अंदर तत्वों का पता कैसे लगाएं
सेलेनियम में, फ़्रेम के अंदर मौजूद तत्वों को एक्सेस करने के लिए, पहले, हमें फ़्रेम के अंदर स्विच करने की आवश्यकता है और फिर तत्वों की पहचान करें क्योंकि हम सामान्य रूप से अलग सेलेनियम लोकेटर का उपयोग करते हैं। IFrame में स्विच किए बिना आपका सेलेनियम कोड आपके तत्वों का पता नहीं लगा सकता है।
नीचे दिए गए स्क्रीनशॉट से पता चलता है कि HTML कोड में फ़्रेम कैसे एम्बेड किए जाते हैं:
सेलेनियम का उपयोग करने के लिए एक IFrame पर स्विच करने के विभिन्न तरीके
# 1) फ़्रेम नाम या आईडी का उपयोग करना
फ़्रेम नाम या फ़्रेम आईडी का उपयोग करके आईफ़्रेम पर स्विच करें, कभी-कभी फ़्रेम नाम या आईडी या दोनों एक कोड में मौजूद होंगे।
वाक्य - विन्यास:
driver.switchTo().frame(1); // for id driver.switchTo().frame('main'); // for name
# 2) फ़्रेम इंडेक्स का उपयोग करना
यदि उपलब्ध हो तो फ़्रेम इंडेक्स का उपयोग करके फ़्रेम का पता लगाएँ।
वाक्य - विन्यास:
driver.switchTo().frame(0); // frame index starts with 0
# 3) वेब तत्व का उपयोग करना
सेलेनियम लोकेटर का उपयोग करके फ्रेम का पता लगाएँ ।
वाक्य - विन्यास:
driver.switchTo().frame('Locate the frame using xpath or by any other locator');
फ़्रेम का उपयोग करते हुए अन्य संचालन
# 1) माता-पिता या पूर्वज फ्रेम में वापस स्विच करना
'SwitchTo.parentFrame' कमांड का उपयोग करके फ्रेम 3 से फ्रेम 2 पर वापस स्विच करना ।
वाक्य - विन्यास:
driver.switchTo().parentFrame();
# 2) किसी अन्य फ्रेम में स्विच करना
यदि आप फ़्रेम 3 से फ़्रेम 1 या डिफ़ॉल्ट फ़्रेम पर स्विच करना चाहते हैं, तो 'switchTo.defaultContent' कमांड का उपयोग करें।
वाक्य - विन्यास:
driver.switchTo().defaultContent();
नीचे दिए गए कोड में हम एक फ्रेम के अंदर मौजूद एक नाम टेक्स्ट बॉक्स का पता लगा रहे हैं।
क्या होगा यदि हम फ्रेम में स्विच किए बिना इसे सीधे पता लगाने की कोशिश करते हैं?
परिणाम देखें:
कोड 'तत्व का पता लगाने में असमर्थ: {' विधि ':' xpath ',' चयनकर्ता ':' // इनपुट [@ name = 'name'] '} के कारण विफल रहा
अब वेब एलीमेंट का उपयोग करके फ़्रेम के अंदर स्विच करें या सेलेनियम लोकेटर का उपयोग करके कहें और टेक्स्ट बॉक्स फ़ील्ड का पता लगाएं।
नीचे दिए गए फ्रेम के अंदर स्विच करने के लिए पूरा कोड है:
package com.wordpress.pages; import java.util.List; import org.junit.Assert; import org.junit.Test; import org.openqa.selenium.Alert; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class Frame { static WebDriver driver; @Test public void Test(){ System.setProperty('webdriver.chrome.driver', 'D:\Srinivas\New folder\exe\chromedriver.exe'); driver = new ChromeDriver(); driver.get('http://www.dwuser.com/education/content/the-magical-iframe-tag-an-introduction/'); //identifying the frame using locator or say using webelement driver.switchTo().frame(driver.findElement(By.xpath('//div[@id='eduFooterWrap']//iframe[1]'))); driver.findElement(By.xpath('//input[@name='name']')).sendKeys('SoftwareTestingHelp.com'); } }
आउटपुट:
यह है कि हमें सेलेनियम का उपयोग करने वाले तत्वों का पता लगाने के लिए फ़्रेम के बीच स्विच करने की आवश्यकता है। यदि आपके वेब पेज पर कई फ्रेम हैं तो आपको कई बार स्विच करने की आवश्यकता है।
निष्कर्ष
- iFrame एक HTML डॉक्यूमेंट है जो दूसरे HTML डॉक्युमेंट के भीतर एम्बेडेड है। iFrames HTML टैग का उपयोग करके HTML दस्तावेज़ में स्पष्ट रूप से उल्लिखित है
- स्विचट.फ्रेम (इंट फ्रेम फ्रेम) विधि उपयोगकर्ताओं को फ्रेम आईडी का उपयोग करके एक विशेष फ्रेम में स्विच करने की अनुमति देती है।
- switchTo.frame (स्ट्रिंग फ्रेमनेम) विधि उपयोगकर्ताओं को फ्रेम के डेवलपर-परिभाषित नाम का उपयोग करके किसी विशेष फ्रेम में स्विच करने की अनुमति देती है।
- switchTo.frame (WebElement फ्रेम ईलमेंट) विधि उपयोगकर्ताओं को वेब तत्व के स्थान के आधार पर एक फ़्रेम पर स्विच करने की अनुमति देती है।
=> सभी सेलेनियम ट्यूटोरियल यहाँ देखें।
अनुशंसित पाठ
- ककड़ी सेलेनियम ट्यूटोरियल: ककड़ी जावा सेलेनियम वेबड्राइवर एकीकरण
- सेलेनियम वेबड्राइवर का परिचय - सेलेनियम ट्यूटोरियल # 8
- हमारी पहली वेबड्राइवर स्क्रिप्ट का कार्यान्वयन - सेलेनियम वेबड्राइवर ट्यूटोरियल # 10
- सेलेनियम पूछे जाने वाले प्रश्न
- सेलेनियम वेबड्राइवर में अलर्ट / पॉपअप कैसे हैंडल करें - सेलेनियम ट्यूटोरियल # 16
- सेलेनियम स्क्रिप्ट में वेब टेबल्स, फ्रेम्स, और डायनामिक एलिमेंट्स को हैंडल करना - सेलेनियम ट्यूटोरियल # 18
- सेलेनियम वेबड्राइवर में निहित और स्पष्ट प्रतीक्षा (सेलेनियम के प्रकार के प्रकार)
- गाइड सेलेनियम वेबड्राइवर में अत्यधिक रिपोर्ट उत्पन्न करने के लिए