使用 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")));
【讨论】:
+1switchTo().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 中查找元素的主要内容,如果未能解决你的问题,请参考以下文章