Many web pages uses <object> tags for embedded object within an HTML document. This element is mainly used to embed SVG elements, multimedia, Java applets, Flash etc.
Many web pages also use the <object> tag to embed another webpage or frames into the HTML document.
Though <object> tags looks slimilar to <iframe>, it won't work if you do switch frame by webdriver (e.g. driver.switchTo().frame(objIDorIndex);)
Here are few scenarios that you can handle using selenium webdriver with javascript/jQuery.
Example - 1:
Many web pages also use the <object> tag to embed another webpage or frames into the HTML document.
Though <object> tags looks slimilar to <iframe>, it won't work if you do switch frame by webdriver (e.g. driver.switchTo().frame(objIDorIndex);)
Here are few scenarios that you can handle using selenium webdriver with javascript/jQuery.
Example - 1:
Example - 2:
(Case 1) In example-1, if you want to click on a "g" elements of SVG element
WebElement objectTag= findElement(By.xpath("//div[@id='imageholder']//object")); ((JavascriptExecutor) driver).executeScript("return (arguments[0].contentDocument.getElementsByTagName('g')[0]).click()", objectTag);(Case 2) In example-2, if you want to get the title for assertion, then try as an example given below
List<WebElement> objects = findElements(By.xpath("//div[@class='contentViewer']//object")); String objectId = objects.get(0).getAttribute("id"); WebDriver driver = getDriver(); JavascriptExecutor js = (JavascriptExecutor) driver; String text = (String) js.executeScript("return (((document.getElementById('" + objectId + "')).contentDocument).getElementsByClassName('titleText')[0]).innerHTML"); getDriver().switchTo().defaultContent();(Case 3) In example-2, if you want to get any specific attribute, then try something like below
List<WebElement> objects = findElements(By.xpath("//div[@class='contentViewer']//object")); String objectId = objects.get(0).getAttribute("id"); WebElement objectTag = findElement(By.id(objectId)); String btnTitle = ((JavascriptExecutor) driver).executeScript("return arguments[0].contentDocument.getElementById('closeText').getAttribute('title')", objectTag).toString(); Assert.assertEquals(btnTitle, "Cancel to close");(Case 4) In example-2, if you want to do any action inside the iFrame, you can use as below given example
WebElement btnDone = (WebElement) js.executeScript("return ((((document.getElementById('" + objectId + "')).contentDocument).getElementsByTagName('iFrame')[0]).getElementById('done'))"); btnDone.click();Note: I have just gave few examples actions w.r.t my example html code snippet. By referring the above examples you do actions inside <object> tag as per your requirements
Nice post, thumbs for the post
ReplyDeleteHi,
ReplyDeleteI am trying to switch from HTML DOM to SVG DOM.. is this possible?
All WebElements are in HTML DOM and SVG Elements in seperate DOM (SVG DOM), is there any way to switch from HTML DOM to SVG DOM and select and SVG text
Yes, you should be able to switch.
DeleteFirst you can try with the normal way of switching frame in selenium and if it doesn't work try with javascript. With the javascript executeScript() method you should be able to do actions with almost every element in the DOM. You can try with the reference of case-4 in my example.