كيفية التعامل مع iFrames في Selenium برنامج تشغيل الويب: التبديل إلى ()

إطار iFrame في Selenium برنامج تشغيل الويب

إطار iFrame في Selenium برنامج تشغيل الويب هي صفحة ويب أو إطار مضمن مضمن في صفحة ويب أخرى أو مستند HTML مضمن داخل مستند HTML آخر. غالبًا ما يُستخدم إطار iframe لإضافة محتوى من مصادر أخرى مثل إعلان إلى صفحة ويب. يتم تعريف iframe باستخدامIFRAME> علامة.

كيفية التعرف على iFrame

لا يمكننا اكتشاف الإطارات بمجرد رؤية الصفحة أو عن طريق فحص Firebug.

لاحظ الصورة أدناه، الإعلان المعروض عبارة عن إطار مضمّن، ولا يمكننا تحديده أو التعرف عليه بمجرد الفحص باستخدام Firebug. لذا فإن السؤال هو كيف يمكنك تحديد الإطار المضمّن؟

تحديد إطار Iframe
كيفية التعرف على iframe باستخدام Selenium ويب درايفر

يمكننا التعرف على الإطارات في Selenium باستخدام الطرق الواردة أدناه:

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

في الرسم البياني أعلاه، يمكنك أن ترى أن 'هذا الإطاريتوفر الخيار عند النقر بزر الماوس الأيمن، لذلك نحن الآن متأكدون من أنه إطار iframe.

يمكننا أيضًا تحديد العدد الإجمالي لإطارات iframe باستخدام المقتطف أدناه.

Int size = driver.findElements(By.tagName("iframe")).size();

كيفية التعامل مع الإطارات في Selenium باستخدام أوامر WebDriver

في الأساس، يمكننا تبديل العناصر والتعامل مع الإطارات Selenium باستخدام 3 طرق.

  • حسب الفهرس
  • بالاسم أو الهوية
  • بواسطة عنصر الويب

الطريقة الأولى: التبديل إلى الإطار حسب الفهرس

الفهرس هو إحدى سمات التعامل مع الإطار Selenium والتي من خلالها يمكننا التحول إليه.

يبدأ فهرس iframe بـ "0".

لنفترض أنه إذا كان هناك 100 إطار في الصفحة، فيمكننا التبديل إلى الإطار الموجود Selenium باستخدام الفهرس.

  • driver.switchTo().frame(0);
  • driver.switchTo().frame(1);

الطريقة الثانية: التبديل إلى الإطار حسب الاسم أو المعرف

الاسم والمعرف هما سمتان للتعامل مع الإطارات في Selenium والتي من خلالها يمكننا التبديل إلى iframe.

  • driver.switchTo().frame("iframe1");
  • driver.switchTo().frame("id of the element");

مثال على التبديل إلى iframe من خلال المعرف:

إلى الإطار بواسطة Web Element

يمكننا الوصول إلى iframe هذا من خلال عنوان URL التالي: https://demo.guru99.com/test/guru99home/

التعامل مع الإطارات في Selenium استخدام أوامر WebDriver

من المستحيل النقر فوق iframe مباشرة من خلاله كسباث لأنه iframe. علينا أولاً التبديل إلى الإطار ومن ثم يمكننا النقر باستخدام xpath.

الخطوة 1)

WebDriver driver = new FirefoxDriver();

driver.get("https://demo.guru99.com/test/guru99home/");

driver.manage().window().maximize();

  • نقوم بتهيئة Firefox سائق.
  • انتقل إلى موقع "guru99" الذي يتكون من iframe.
  • تكبير النافذة.

الخطوة 2)

driver.switchTo().frame("a077aa5e");
  • في هذه الخطوة نحتاج إلى معرفة معرف إطار iframe عن طريق الفحص من خلال Firebug.
  • ثم قم بالتبديل إلى iframe من خلال المعرف.

الخطوة 3)

driver.findElement(By.xpath("html/body/a/img")).click();
  • نحن هنا بحاجة إلى معرفة xpath للعنصر المراد النقر عليه.
  • انقر فوق العنصر باستخدام أمر برنامج تشغيل الويب الموضح أعلاه.

ها هو الكود الكامل:

public class SwitchToFrame_ID {
public static void main(String[] args) {

		WebDriver driver = new FirefoxDriver(); //navigates to the Browser
	    driver.get("https://demo.guru99.com/test/guru99home/"); 
	       // navigates to the page consisting an iframe

	       driver.manage().window().maximize();
	       driver.switchTo().frame("a077aa5e"); //switching the frame by ID

			System.out.println("********We are switch to the iframe*******");
     		driver.findElement(By.xpath("html/body/a/img")).click();
  		    //Clicks the iframe
       
  			System.out.println("*********We are done***************");
      }
}		

الإخراج:

ينتقل المتصفح إلى الصفحة التي تتكون من إطار iframe أعلاه وينقر على إطار iframe.

الطريقة الثالثة: التبديل إلى الإطار بواسطة عنصر الويب

يمكننا أيضًا التبديل إلى iframe باستخدام عنصر الويب.

  • driver.switchTo().frame(WebElement);

كيفية العودة إلى الإطار الرئيسي

علينا أن نخرج من إطار iframe.

للرجوع إلى الإطار الأصلي، يمكنك إما استخدام SwitchTo().parentFrame() أو إذا كنت تريد العودة إلى الإطار الرئيسي (أو معظم الإطار الأصلي)، يمكنك استخدام SwitchTo().defaultContent();

	    driver.switchTo().parentFrame();
	    driver.switchTo().defaultContent();

كيفية التبديل عبر الإطار، إذا لم نتمكن من التبديل باستخدام المعرف أو عنصر الويب:

لنفترض أنه إذا كان هناك 100 إطار في الصفحة، ولا يوجد معرف متاح، ففي هذه الحالة، لا نعرف من أي عنصر iframe مطلوب يتم تحميله (هذا هو الحال عندما لا نعرف فهرس الإطار أيضًا).

الحل للمشكلة المذكورة أعلاه هو أنه يجب علينا العثور على فهرس iframe الذي يتم من خلاله تحميل العنصر ثم نحتاج إلى التبديل إلى iframe من خلال الفهرس.

فيما يلي خطوات العثور على فهرس الإطار الذي يتم من خلاله تحميل العنصر باستخدام المقتطف أدناه

الخطوة 1)

WebDriver driver = new FirefoxDriver();
driver.get("https://demo.guru99.com/test/guru99home/");
driver.manage().window().maximize();
  • تهيئة Firefox سائق.
  • انتقل إلى موقع "guru99" الذي يتكون من iframe.
  • تكبير النافذة.

الخطوة 2)

int size = driver.findElements(By.tagName("iframe")).size();
  • يعثر الكود أعلاه على العدد الإجمالي لإطارات iframe الموجودة داخل الصفحة باستخدام اسم العلامة "iframe".

الخطوة 3)

الهدف ل ستكون هذه الخطوة هي معرفة فهرس iframe.

for(int i=0; i<=size; i++){
	driver.switchTo().frame(i);
	int total=driver.findElements(By.xpath("html/body/a/img")).size();
	System.out.println(total);
	    driver.switchTo().defaultContent();}

فوق "forloop"، يكرر جميع إطارات iframe الموجودة في الصفحة ويطبع "1" إذا تم العثور على إطار iframe المطلوب وإلا فسيتم إرجاع "0".

إليك الكود الكامل حتى الخطوة 3:

public class IndexOfIframe {
public static void main(String[] args) {
	    WebDriver driver = new FirefoxDriver();
	    driver.get("https://demo.guru99.com/test/guru99home/");  
	    driver.manage().window().maximize();
	    //driver.manage().timeouts().implicitlyWait(100, TimeUnit.SECONDS);
	    int size = driver.findElements(By.tagName("iframe")).size();

	    for(int i=0; i<=size; i++){
		driver.switchTo().frame(i);
		int total=driver.findElements(By.xpath("html/body/a/img")).size();
		System.out.println(total);
	    driver.switchTo().defaultContent();}}}

تنفيذ هذا البرنامج وسيكون الإخراج كما يلي:

الإخراج:

1
0
0
0	
0
0

التحقق من الإخراج، يمكنك العثور على سلسلة من 0 و1.

  • أينما وجدت الرقم "1" في الإخراج، فهو فهرس الإطار الذي يتم من خلاله تحميل العنصر.
  • نظرًا لأن فهرس iframe يبدأ بـ "0" إذا وجدت الرقم 1 في 1stمكان، فإن المؤشر هو 0.
  • إذا وجدت 1 في 3rd المكان، المؤشر هو 2.

يمكننا التعليق على حلقة for، بمجرد العثور على الفهرس.

الخطوة 4)

driver.switchTo().frame(0);
  • بمجرد العثور على فهرس العنصر، يمكنك التبديل فوق الإطار باستخدام الأمر أعلاه.
  • driver.switchTo().frame(تم العثور على الفهرس من الخطوة 3);

الخطوة 5)

driver.findElement(By.xpath("html/body/a/img")).click();
  • سوف ينقر الكود أعلاه على iframe أو العنصر الموجود في iframe.

لذلك سيكون الكود الكامل كما يلي:

public class SwitchToframe   {
public static void main(String[] args) throws NoSuchElementException{
	    WebDriver driver = new FirefoxDriver();
	    driver.get("https://demo.guru99.com/test/guru99home/");  
	    driver.manage().window().maximize();
	    //int size = driver.findElements(By.tagName("iframe")).size();
	
	/*for(int i=0; i<=size; i++){
	    driver.switchTo().frame(i);
	    int total=driver.findElements(By.xpath("html/body/a/img")).size();
		System.out.println(total);
	    driver.switchTo().defaultContent(); //switching back from the iframe
	 }*/
	            
		//Commented the code for finding the index of the element
	    driver.switchTo().frame(0); //Switching to the frame
		System.out.println("********We are switched to the iframe*******");
		driver.findElement(By.xpath("html/body/a/img")).click();
		
		//Clicking the element in line with Advertisement
	    System.out.println("*********We are done***************");
	        }
	    }

الإخراج:

ينتقل المتصفح إلى الصفحة التي تتكون من إطار iframe أعلاه وينقر على إطار iframe.

مفهوم الإطارات المتداخلة في Selenium

لنفترض أن هناك إطارين أحدهما داخل الآخر كما هو موضح في الصورة أدناه ومتطلبنا هو طباعة النص في الإطار الخارجي والإطار الداخلي.

في حالة الإطارات المتداخلة

  • في البداية يجب علينا التبديل إلى الإطار الخارجي إما عن طريق فهرس أو معرف إطار iframe
  • بمجرد التبديل إلى الإطار الخارجي، يمكننا العثور على العدد الإجمالي لإطارات iframe داخل الإطار الخارجي، و
  • يمكننا التبديل إلى الإطار الداخلي بأي من الطرق المعروفة.

أثناء الخروج من الإطار، يجب أن نخرج بنفس الترتيب الذي دخلنا فيه من الإطار الداخلي أولاً ثم الإطار الخارجي.

رمز HTML للإطار المتداخل أعلاه كما هو موضح أدناه.

مفهوم الإطارات المتداخلة في Selenium

يشرح رمز HTML أعلاه بوضوح علامة iframe (المظللة باللون الأخضر) ضمن علامة iframe أخرى، مما يشير إلى وجود إطارات iframe متداخلة.

فيما يلي خطوات التبديل إلى الإطار الخارجي وطباعة النص على الإطارات الخارجية:

الخطوة 1)

	WebDriver driver=new FirefoxDriver();
	    driver.get("Url");
	    driver.manage().window().maximize();
	    driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
	    int size = driver.findElements(By.tagName("iframe")).size();
	    System.out.println("Total Frames --" + size);
	    
		// prints the total number of frames 
		driver.switchTo().frame(0); // Switching the Outer Frame    		
	    System.out.println (driver.findElement(By.xpath("xpath of the outer element ")).getText());
  • التبديل إلى الإطار الخارجي.
  • يطبع النص على الإطار الخارجي.

بمجرد أن نتحول إلى الإطار الخارجي، يجب أن نعرف ما إذا كان هناك أي إطار داخلي موجود داخل الإطار الخارجي

الخطوة 2)

size = driver.findElements(By.tagName("iframe")).size();
    // prints the total number of frames inside outer frame           
    System.out.println("Total Frames --" + size);
  • يبحث عن العدد الإجمالي لإطارات iframe داخل الإطار الخارجي.
  • إذا تم العثور على الحجم "0"، فلا يوجد إطار داخلي داخل الإطار.

الخطوة 3)

driver.switchTo().frame(0); // Switching to innerframe
System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
  • التبديل إلى الإطار الداخلي
  • يطبع النص على الإطار الداخلي.

ها هو الكود الكامل:

public class FramesInsideFrames {
public static void main(String[] args) {
WebDriver driver=new FirefoxDriver();
	    driver.get("Url");
	    driver.manage().window().maximize();
	    driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);

	    int size = driver.findElements(By.tagName("iframe")).size();
	    System.out.println("Total Frames --" + size);
               
		// prints the total number of frames 
		driver.switchTo().frame(0); // Switching the Outer Frame    		
	    System.out.println (driver.findElement(By.xpath("xpath of the outer element ")).getText());

		//Printing the text in outer frame
		size = driver.findElements(By.tagName("iframe")).size();
	    // prints the total number of frames inside outer frame           
                                                                                                          
	    System.out.println("Total Frames --" + size);
	    driver.switchTo().frame(0); // Switching to innerframe
	    System.out.println(driver.findElement(By.xpath("xpath of the inner element ")).getText());
		
		//Printing the text in inner frame
		driver.switchTo().defaultContent();
	}
}

الناتج:

سيؤدي إخراج الكود أعلاه إلى طباعة النص في الإطار الداخلي والإطار الخارجي.

تفاصيل أكثر أقرأ المزيد