【问题标题】:Selenium handling html elements inside object tagSelenium 处理对象标签内的 html 元素
【发布时间】:2015-10-07 18:40:11
【问题描述】:

我正在努力验证 html 对象标签中的 html 元素。

以下是我的测试 html (test1.html)。

<html>
<body>
    <h1>this is test 1</h1>
    <object id='obj1' width="100%" height="200px" data="http://www.w3schools.com/"></object>
    <br>    <br>    <br>    <br>
    <iframe id='ifr1' width="100%" height="200px" src="http://www.w3schools.com/"></iframe>
</body>
</html>

iframe的情况下,使用webdriver switchto frame方法就可以轻松处理,如下例。

@Test
public void testIframe() {
    try {
        FirefoxDriver driver = new FirefoxDriver();
        driver.get("http://localhost/test1.html");

        driver.switchTo().frame(0);
        Assert.assertTrue(driver.findElement(By.xpath("/html/body/div[1]/div")).getText().equals("THE WORLD'S LARGEST WEB DEVELOPER SITE"));

        driver.quit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

但在对象标签的情况下,switchTo 方法不能以相同的方式应用。 我很好奇 Selenium 提供了这种处理方式。

有没有人想办法解决这个问题,或者有什么建议?

【问题讨论】:

    标签: java selenium


    【解决方案1】:

    您也可以使用 SwitchTo api 通过这种方式访问​​对象元素:

    driver.SwitchTo().Frame(driver.FindElement(By.TagName("object")));
    

    【讨论】:

      【解决方案2】:

      实际上在我们使用的框架的WebDriver中

      driver.switchTo().frame();
      

      对于我们可以直接处理或直接执行操作的对象

      例如从您的代码中,如果我想使用value of data attribute

      我用过

      driver.findElement(By.xpath("//object[@id='obj1']")).getAttribute("data")
      

      这将returnhttp://www.w3schools.com/

      我们可以像普通网页元素一样处理它,我们不需要使用 switchTo()

      【讨论】:

      • 感谢您的回复。我正在尝试检查由 data 属性定义的 html 元素内部。例如 System.out.println(driver.findElement(By.xpath("//object[@id='obj1']/html/body/div[1]/div")).getText()) == > 这会引发“无法定位元素异常”
      • @SeonghaHan 我猜,你写错了你的 xpath..你想得到什么文本
      • 我正在尝试验证 w3schools.com 页面中的一些文本,而不是 test1.html。
      • Firebug 不代表内页的 xpath。它只显示对象标签本身。如果谷歌 DOM 检查器在里面显示完整的 html,但没有像我上面提到的那样工作。我想这不是来自错误的 xpath 表达式。我怀疑 webdriver 不支持获取元素 html 对象标记的目标。但我期待存在另一种解决方法。对于 iframe 标签,我可以使用 switchTo frame 方法做任何事情。谢谢
      • @SeonghaHan 实际上您使用的 xpath 格式错误 "//object[@id='obj1']/html/body/d‌​iv[1]/div"
      【解决方案3】:

      我还使用了类似于@Deepak_Mahalingam 的东西。万一有人发现他的语法不起作用。我使用 chrome 并检查代码以获取 xpath。

      link = driver.find_element_by_xpath('//*[@id="gl-consoleTabs-slides"]/div/div/object').get_attribute('data')
      

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题,以下解决方案适用于我的项目:

        1.我写了一个java方法从源代码&lt;Object&gt;标签中的data属性中获取URL。
        2.在新选项卡中打开提取的 URL 并执行所需的测试。
        3.切换回主标签。

        这里是我使用的方法,你可以根据自己的需要修改:

        public void getObjectTagURL(){
           try {
              String pageSource= driver.getPageSource(); 
              int startIndex =str.indexOf("http://www.myURL");         
              int endIndex= str.indexOf("</object>");
              String url= str.substring(startIndex, endIndex);  
           } catch (Exception e) {
                System.out.println(e);   
             }
        

        希望对你有帮助。

        【讨论】:

          最近更新 更多