使用 Java 和 Selenium WebDriver 在表单和 iframe 中查找元素

Posted

技术标签:

【中文标题】使用 Java 和 Selenium WebDriver 在表单和 iframe 中查找元素【英文标题】:Find elements inside forms and iframe using Java and Selenium WebDriver 【发布时间】:2014-08-06 12:03:27 【问题描述】:

我正在尝试访问存在于<form> <iFrame> <form> elements </form> </iFrame> </form> 下的元素。

您能帮我访问这些 “元素”,我正在使用 Selenium Webdriver 和 JAVA 吗?

遇到的问题:能够到达目标页面(存在上述元素的地方),但我的代码无法识别这些元素。

XML结构概述:

<body>
    <form action="https://abcd/efgh/" name="outerForm" method="post" target="iFrameTitle">
        <iframe   src="" title="Frame for Java Test" name="iFrameTitle" scrolling="auto" frameborder="0">
            <form id="innerFormID" name="innerForm" action="/xxx/xxxx/yyyy/zzzz/" method="post" autocomplete="off">
                <fieldset id="ncDetailsInner">
                    <div id="element1">
                        <label for="label1">
                        <abbr title="Required field">*</abbr></label>
                        <input name="label2" type="text" maxlength="30" id="cardHolder" value="" >
                    </div>

                    <div id="element2">
                        <label for="label3">Label3 <abbr title="Required field">*</abbr></label>
                        <div id="element3">
                            <label for="label4">Label4<abbr title="Required field">*</abbr></label>
                            <input id="label5" name="labelname5" type="text" maxlength="19" value="">
                        </div>

                        <div id="element4">
                            <label for="label6">Label6</label>
                            <input id="label7" name="labelname7" type="text" size="2" maxlength="2" value="" class="text disabled" disabled="">
                        </div>
                    </div>
                </fieldset>
            </form> 

        </iframe>
    </form>
</body>

代码摘录:

WebDriverWait wait_iframe = new WebDriverWait(driver, 20000);

wait_iframe.until(ExpectedConditions.visibilityOfElementLocated((By.id("element2"))));

calling_function(sh1.getCell(col + 10, row).getContents(), 
                sh1.getCell(col + 11, row).getContents(),
                sh1.getCell(col + 12, row).getContents(), 
                sh1.getCell(col + 14, row).getContents());                      

public static void called_funciton(String string1, String string2,
        String string3, String string4) 
        driver.findElement(By.name("Element1 Name")).sendKeys(string1);
        driver.findElement(By.id("Element2 ID")).sendKeys(string2);
        driver.findElement(By.id("Element3 ID")).sendKeys(string3);
        driver.findElement(By.id("Element4 ID")).sendKeys(string4);
        driver.findElement(By.name("submitButton")).click();
    

如果需要更多详细信息,请告诉我!

【问题讨论】:

How to switch between frames in Selenium WebDriver using Java的可能重复 【参考方案1】:

通过使用https://github.com/nick318/FindElementInFrames 您可以在所有框架中找到 webElement:

SearchByFramesFactory searchFactory = new SearchByFramesFactory(driver);
SearchByFrames searchInFrame = searchFactory.search(() -> driver.findElement(By.tagName("body")));
Optional<WebElement> elem = searchInFrame.getElem();

【讨论】:

【参考方案2】:

Selenium >= 3.41 (C#) 上,正确的语法是:

webDriver = webDriver.SwitchTo().Frame(webDriver.FindElement(By.Name("icontent")));

【讨论】:

这是一个 Java 问题!【参考方案3】:

使用 iframe 时,您必须先切换到 iframe,然后再选择 iframe 的元素

你可以这样做:

driver.switchTo().frame(driver.findElement(By.id("frameId")));
//do your stuff
driver.switchTo().defaultContent();

如果你的 frameId 是动态的,并且你只有一个 iframe,你可以使用类似的东西:

driver.switchTo().frame(driver.findElement(By.tagName("iframe")));

【讨论】:

+1 switchTo().defaultContent() 我猜这就是你在工作完成后取消选择框架的方式。【参考方案4】:

在尝试搜索 iframe 中的元素之前,您必须将 Selenium 焦点切换到 iframe。

在搜索 iframe 中的元素之前试试这个:

driver.switchTo().frame(driver.findElement(By.name("iFrameTitle")));

【讨论】:

按照建议,添加在下面...但我仍然遇到同样的问题public static void called_funciton(String string1, String string2, String string3, String string4) driver.switchTo().frame(driver.findElement(By.name("iFrameTitle"))); driver.findElement(By.name("Element1 Name")).sendKeys(string1); driver.findElement(By.id("Element2 ID")).sendKeys(string2); driver.findElement(By.id("Element3 ID")).sendKeys(string3); driver.findElement(By.id("Element4 ID")).sendKeys(string4); driver.findElement(By.name("submitButton")).click(); 尝试将新的 switchTo 行作为代码块的第一行。 IE。在WebDriverWait wait_iframe 之前,在你做任何其他事情之前。 谢谢,这一次我可以更进一步,但是遇到了一个异常:Exception in thread "main" java.lang.NullPointerException at roll_forward_test.account_creation.thistle_home(xyz_creation.java:680) at roll_forward_test.account_creation.main(xyz_creation.java:463)(xyz_creation.java:680) 指的是@ 987654325@ 在被调用函数上,(xyz_creation.java:463) 行指的是调用函数。 calling_function(S1, S2, S3, S4);请指教! 如果您最初关于访问 iframe 中的元素的问题已经得到解答,请将此答案标记为已接受,我们可以查看后续问题。 我花了几个小时试图找到解决方案,你让我走上了正确的道路。谢谢!

以上是关于使用 Java 和 Selenium WebDriver 在表单和 iframe 中查找元素的主要内容,如果未能解决你的问题,请参考以下文章

使用 selenium webdriver 定位由 javascript 创建的元素

selenium模块

selenium模块

selenium介绍

Selenium库

使用selenium和phantomJS浏览器获取网页内容的小演示