我在我的java程序中使用selenium firefox webdriver。我正在尝试在文本框中键入一个字符串,然后单击“提交”。但是,文本框嵌套在隐藏元素中,因此我无法使用带有id,xpath或css的driver.findElement
访问它。 (但是在网页上可以看到)。我得到了NoSuchElementException
以下是网页的html:
<div id="mainContent" style="overflow:hidden;">
<!-- content left here -->
<div id="contentLeft">
<script type="text/javascript" src="/enterprisesolutions/staticcontent/includes/scripts/QuickTask.js"/>
<script type="text/javascript" src="/enterprisesolutions/Includes/Javascript/date-picker.js"/>
<div id="quickTask">
<h2 class="boxContentHead">
<div id="qtBoxContent" class="boxContent quickTaskBack">
<!-- Accounts and Maintenance -->
<div id="qt_accounts_and_maintenance" class="qtStack" style="display:block">
<!-- Orders -->
<div id="qt_orders" class="qtStack" style="display:block">
<!-- Invoice -->
<div id="qt_invoices" class="qtStack" style="display:block">
<div class="qtIcon invoices"/>
<div class="qtContent">
<div class="qtTitle">Invoices</div>
<div class="qtForm">
<div class="qtLabel qtLabelInvoices">
<div class="qtLeftInvoices">
<div class="firstField">
<div class="qtFormLabel">Account/Phone/Circuit</div>
<div>
<input id="qt_invoices_text1" type="text" value=""/>
</div>
</div>
<div class="secondField">
</div>
<div class="qtRight">
</div>
</div>
</div>
<!-- Repairs -->
<div id="qt_repairs" class="qtStack" style="display:block">
<!-- Lottery Reporting -->
<!-- Reporting -->
<form id="quickTaskForm" name="quickTaskForm" action="/enterprisesolutions/global/quickTaskAction.do" method="post">
<!-- QT No Access -->
<!-- QT Request Access -->
<div id="qt_request_access" class="qtStackAccess" style="display:block">
</div>
<div id="qtBottom" class="quickTaskBack" style="background: none repeat scroll 0% 0% transparent;">
</div>
<!-- start promo and customized pod -->
<div id="promo_msg">
<!-- end promo and customized pod -->
</div>
<!-- end content left-->
<div id="contentRight" style="height: 845px;">
<!-- end content right -->
</div>
id = mainContent的div具有“overflow:hidden”的样式,我猜测它会导致webdriver找不到我的元素。
我尝试过以下操作,但由于该字段已隐藏driver.findElement(By.cssSelector("#qt_invoices_text1")).sendKeys("hi");
,因此无效
driver.findElement(By.id("qt_invoices_text1")).sendKeys("hi");
(并使用正确的xpath。)
我听说有一种方法可以使用JavascriptExecutor,但我还没找到。
编辑:这是堆栈跟踪:
Exception in thread "main" org.openqa.selenium.NoSuchElementException: Unable to locate element: {"method":"css selector","selector":"#qt_invoices_text1"}
Command duration or timeout: 20.18 seconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html
Build info: version: '2.33.0', revision: '4e90c97', time: '2013-05-22 15:33:32'
System info: os.name: 'Windows 8', os.arch: 'amd64', os.version: '6.2', java.version: '1.7.0_21'
Session ID: 334122ae-6eab-4036-96ca-1183c9129b51
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{platform=XP, databaseEnabled=true, cssSelectorsEnabled=true, javascriptEnabled=true, acceptSslCerts=true, handlesAlerts=true, browserName=firefox, browserConnectionEnabled=true, nativeEvents=true, webStorageEnabled=true, rotatable=false, locationContextEnabled=true, applicationCacheEnabled=true, takesScreenshot=true, version=21.0}]
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:191)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:307)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByCssSelector(RemoteWebDriver.java:396)
at org.openqa.selenium.By$ByCssSelector.findElement(By.java:407)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:299)
at DownloadInvoice.read(DownloadInvoice.java:282)
at DownloadInvoice.main(DownloadInvoice.java:406)
Caused by: org.openqa.selenium.remote.ErrorHandler$UnknownServerException: Unable to locate element: {"method":"css selector","selector":"#qt_invoices_text1"}
Build info: version: '2.33.0', revision: '4e90c97', time: '2013-05-22 15:33:32'
System info: os.name: 'Windows 8', os.arch: 'amd64', os.version: '6.2', java.version: '1.7.0_21'
Driver info: driver.version: unknown
这是我的java代码(无关紧要但人们一直在问) (更大项目的一部分,这是唯一相关的代码):
driver.get(sheet.getCell(j+1,i).getContents());
driver.findElement(By.id("UserId")).click();
driver.findElement(By.id("UserId")).clear();
driver.findElement(By.id("UserId")).sendKeys(sheet.getCell(j+2,i).getContents());
Thread.sleep(1000);
driver.findElement(By.id("PASSWORD")).click();
driver.findElement(By.id("PASSWORD")).clear();
driver.findElement(By.id("PASSWORD")).sendKeys(sheet.getCell(j+3,i).getContents());
Thread.sleep(5000);
driver.findElement(By.id("submit")).click();
Thread.sleep(2000);
driver.findElement(By.cssSelector("#qt_invoices_text1")).sendKeys("hi");
driver.findElement(By.id("submit")).click();
编辑:我玩过Selenium IDE并在使用命令SelectFrame _shellbody
键入之前选择框架,但是当我导出它时会将其显示为代码中的注释:
// ERROR: Caught exception [ERROR: Unsupported command [selectFrame | _shellbody | ]]
感谢任何帮助!
答案 0 :(得分:5)
尝试使用WebDriverWait
,现在讨论可见性是没有意义的,因为例外是
NoSuchElementException
,这意味着元素不存在。解决此异常后,我们可以讨论可见性。
driver.switchTo().frame(0); // use this if it's in frame and you don't know how to locate it
WebElement input = (new WebDriverWait(driver, 15)).until(ExpectedConditions.presenceOfElementLocated(By.id("qt_invoices_text1")));
同样只是抬头,不要使用Thread.Sleep()
,请使用WebDriverWait。
答案 1 :(得分:2)
即使经过充分的等待,如果它不起作用,那么试试JSExecutor。
JavascriptExecutor js =(JavascriptExecutor)驱动程序;
js.executeScript(“document.getElementById(div element id).click()”);
这应该有用.....
答案 2 :(得分:0)
需要一些等待,在执行脚本时,你的应用程序需要一些时间来加载隐藏元素,同时selenium会提前一步。尝试找到元素,但找不到元素因为这个元素尚未加载,所以它检查一次并抛出异常。使用 WebDriverWait 优先于 Thread.Sleep()。