【问题标题】:Java selenium avoiding iframe address bar elementJava selenium 避免 iframe 地址栏元素
【发布时间】:2023-04-04 23:18:01
【问题描述】:

目前我写了一个小程序,它遍历一个页面并查找标签名=“input”的web元素,然后使用sendkeys向元素发送数据,然后提交。我遇到的问题是,虽然它在大多数情况下都有效,但如果我在页面上有一个 iframe,并且我遍历网页寻找标签名 =“input”的元素,它会专注于 iframe 的地址栏和向它发送数据,然后尝试提交它导致错误(当我在 iframe 中打印地址栏的标记名时,它在控制台上打印出“输入”)。

有没有办法避免 iframe 上的地址栏被作为 tagname = "input" 的元素拾取?

我正在使用以下内容来检查元素是否具有“输入”的标记名:

    List<WebElement> element = driver.findElements(By.xpath("//*"));
    int mainSize = element.size();


    for ( int j = 0; j < mainSize; j++ ) {
        if(frameElement.get(j).getTagName().toString().equals("input")){
        //do something
        }
    }

一些注意事项:

- 在使用 switchTo() 方法切换到 iframe 元素之前,通过标记名搜索“input”元素的网页元素会发生这种情况。

【问题讨论】:

  • 你能分享包含地址栏元素的 iframe 的 html 吗?

标签: java selenium iframe


【解决方案1】:

为了避开地址栏,可以多引入一项检查,确保input元素不是地址栏。以下是实现此目的的更新代码:

List<WebElement> element = driver.findElements(By.xpath("//*"));
        int mainSize = element.size();


        for ( int j = 0; j < mainSize; j++ ) {
            if(element.get(j).getTagName().toString().equals("input") && 
                    !element.get(j).getAttribute("class").equals("urlbar")){
            //do something
            }
        }

更新 1

当出现意外的浏览器搜索栏时,我们可以重试。请尝试以下操作:

 List<WebElement> element = driver.findElements(By.xpath("//*"));
        int mainSize = element.size();


        for ( int j = 0; j < mainSize; j++ ) {
            if(element.get(j).getTagName().toString().equals("input") && 
                    !element.get(j).getAttribute("class").equals("urlbar")){
            //do something
                try {
                element.get(j).sendKeys(somedata); 
                element.get(j).submit();
            } catch (WebDriverException we) {
                System.out.println("It seems browser search bar has been appeared. Retrying...");
                //Pressing escape key to get rid of browser search bar
                element.get(j).sendKeys(Keys.ESCAPE);
                //Retrying
                element.get(j).sendKeys(somedata); 
                element.get(j).submit();
            }
        }
     }

如果您还有任何疑问,请告诉我。

【讨论】:

  • 嘿,非常感谢,这解决了问题,但我现在有一个新问题,似乎代码选择了浏览器的“搜索本页功能”(在浏览器上时 ctrl+f在 Windows 上)并向其发送数据。有没有办法跳过这个?我使用 firefox 作为 gecko 的 webdriver
  • 您能否详细介绍一下这个新问题?
  • 你的意思是在执行过程中按了ctrl+f吗?
  • 我不确定这是否能更好地解释它,但在 Windows 上的 firebox 浏览器上,当用户在键盘上按下“ctrl+f”时,浏览器客户端的某处会出现搜索栏。问题是,代码假设此搜索栏是另一个带有标记名 =“输入”的 Web 元素。因此,当我运行代码时,即使用户没有在浏览器上打开它并向它发送数据,它也会进入搜索栏,然后提交它并出现另一个错误。我也想避免使用搜索栏。这更有意义吗?
  • 感谢您的解释。我明白了这个问题。但是,当我尝试在我的 Firefox 浏览器中按 ctrl + f 时,会出现一个搜索栏,但 selenium 无法识别该搜索栏。这可能是失去焦点的问题。你能分享你输入数据的代码吗?
猜你喜欢
  • 2018-09-28
  • 2012-04-23
  • 1970-01-01
  • 2021-12-30
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多