在Java中使用Selenium单击Javascript生成的字段

在Java中使用Selenium单击Javascript生成的字段,java,selenium,web-scraping,Java,Selenium,Web Scraping,我有一个问题,当我点击网页中的一个元素时,它会创建一段代码,允许你作为一个用户点击并输入金额。然而,当我试图用Selenium实现自动化时,我无法访问这些新元素。如果我只是这样做: driver.findElements(By.cssSelector("id^=field")); 它抛出以下异常: Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Cannot set proper

我有一个问题,当我点击网页中的一个元素时,它会创建一段代码,允许你作为一个用户点击并输入金额。然而,当我试图用Selenium实现自动化时,我无法访问这些新元素。如果我只是这样做:

driver.findElements(By.cssSelector("id^=field"));
它抛出以下异常:

Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Cannot set property 'name' of undefined
如果在单击元素后查看pageSource,新生成的html就在那里,我可以看到需要搜索哪个id。任何帮助都将不胜感激

编辑:

用于查找并单击激活javascript的元素的代码:

List<WebElement> buttons = element.findElements(By.cssSelector("[id^=fieldButtons]"));
for (WebElement element : buttons) {
    element.click();
    // Here is where I want to then access the field and enter data.
}
List buttons=element.findElements(By.cssSelector(“[id^=fieldButtons]”);
for(WebElement:按钮){
元素。单击();
//这里是我想要访问字段并输入数据的地方。
}
以下是使用时的完整堆栈跟踪:

new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.cssSelector("id^=field")));


Starting ChromeDriver 2.27.440175 (9bc1d90b8bfa4dd181fbbf769a5eb5e575574320) on port 18209
Only local connections are allowed.
Mar 10, 2017 7:13:26 AM org.openqa.selenium.support.ui.ExpectedConditions findElement
WARNING: WebDriverException thrown by findElement(By.cssSelector: id^=field)
org.openqa.selenium.WebDriverException: unknown error: Cannot set property 'name' of undefined
(Session info: chrome=56.0.2924.87)
(Driver info: chromedriver=2.27.440175 (9bc1d90b8bfa4dd181fbbf769a5eb5e575574320),platform=Linux 4.4.8-040408-generic x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 35 milliseconds
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities [{applicationCacheEnabled=false, rotatable=false, mobileEmulationEnabled=false, networkConnectionEnabled=false, chrome={chromedriverVersion=2.27.440175 (9bc1d90b8bfa4dd181fbbf769a5eb5e575574320), userDataDir=/tmp/.org.chromium.Chromium.89aRVC}, takesHeapSnapshot=true, pageLoadStrategy=normal, databaseEnabled=false, handlesAlerts=true, hasTouchScreen=false, version=56.0.2924.87, platform=LINUX, browserConnectionEnabled=false, nativeEvents=true, acceptSslCerts=true, locationContextEnabled=true, webStorageEnabled=true, browserName=chrome, takesScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, unexpectedAlertBehaviour=}]
Session ID: 75f1b0b4a60c26c1d9ec0bac0e4fa0e4
*** Element info: {Using=css selector, value=id^=field}
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:363)
at org.openqa.selenium.remote.RemoteWebDriver.findElementByCssSelector(RemoteWebDriver.java:492)
at org.openqa.selenium.By$ByCssSelector.findElement(By.java:430)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:355)
at org.openqa.selenium.support.ui.ExpectedConditions.findElement(ExpectedConditions.java:899)
at org.openqa.selenium.support.ui.ExpectedConditions.access$000(ExpectedConditions.java:41)
at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:205)
at org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:201)
at org.openqa.selenium.support.ui.ExpectedConditions$22.apply(ExpectedConditions.java:653)
at org.openqa.selenium.support.ui.ExpectedConditions$22.apply(ExpectedConditions.java:646)
at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:238)
at webScrape.findFieldToFill(webScrape.java:215)
at webScrape.<init>(webScrape.java:26)
at Main.main(Main.java:6)
newwebdriverwait(driver,10).until(ExpectedConditions.elementtobelickable(By.cssSelector(“id^=field”));
在端口18209上启动ChromeDriver 2.27.440175(9BC1D90B8BF4DD181FBBF769A5EB5E5755720)
只允许本地连接。
2017年3月10日上午7:13:26 org.openqa.selenium.support.ui.ExpectedConditions findElement
警告:findElement引发WebDriverException(by.cssSelector:id^=field)
org.openqa.selenium.WebDriverException:未知错误:无法设置未定义的属性“name”
(会话信息:chrome=56.0.2924.87)
(驱动程序信息:chromedriver=2.27.440175(9BC1D90B8BFA4DD181FBBF769A5EB5E5755320),平台=Linux 4.4.8-040408-generic x86_64)(警告:服务器未提供任何堆栈跟踪信息)
命令持续时间或超时:35毫秒
驱动程序信息:org.openqa.selenium.chrome.ChromeDriver
功能[{applicationCacheEnabled=false,rotatable=false,mobileEmulationEnabled=false,networkConnectionEnabled=false,chrome={chromedriverVersion=2.27.440175(9BC1D90B8BF4DD181FBBF769A5EB5E575574320),userDataDir=/tmp/.org.chromium.chromium.89aRVC},takesHeapSnapshot=true,pageLoadStrategy=normal,databaseEnabled=false,handlesAlerts=true,hasTouchScreen=false,version=56.0.2924.87,platform=LINUX,browserConnectionEnabled=false,nativeEvents=true,acceptSslCerts=true,locationContextEnabled=true,WebStorage=true,browserName=chrome,TakesScreensShot=true,javascriptEnabled=true,cssSElectorEnabled=true,未预料的AlertBehaviour=}]
会话ID:75f1b0b4a60c26c1d9ec0bac0e4fa0e4
***元素信息:{Using=css选择器,value=id^=field}
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.openqa.selenium.remote.ErrorHandler.CreateTrowable(ErrorHandler.java:206)
位于org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
位于org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:678)
位于org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:363)
位于org.openqa.selenium.remote.RemoteWebDriver.findElementByCssSelector(RemoteWebDriver.java:492)
位于org.openqa.selenium.By$ByCssSelector.findelelement(By.java:430)
位于org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:355)
位于org.openqa.selenium.support.ui.ExpectedConditions.findElement(ExpectedConditions.java:899)
位于org.openqa.selenium.support.ui.ExpectedConditions.access$000(ExpectedConditions.java:41)
位于org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:205)
位于org.openqa.selenium.support.ui.ExpectedConditions$7.apply(ExpectedConditions.java:201)
位于org.openqa.selenium.support.ui.ExpectedConditions$22.apply(ExpectedConditions.java:653)
位于org.openqa.selenium.support.ui.ExpectedConditions$22.apply(ExpectedConditions.java:646)
位于org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:238)
在webScrape.findFieldToFill(webScrape.java:215)
在webScrape。(webScrape.java:26)
Main.Main(Main.java:6)

您是否尝试使用JavascriptExecutor输入金额并执行用户单击。对我来说,当我无法使用driver.click()或driver.sendKeys()成功单击或输入值时,它会有所帮助

举个例子

    List<WebElement> buttons = element.findElements(By.cssSelector("[id^=fieldButtons]"));
    for (WebElement element : buttons) {
       element.click();
       Thread.sleep(2000) //sometimes I use thread sleep for simple wait condition
       ((JavascriptExecutor) driver).executeScript("document.getElementById(\"field\").setAttribute('amount','" + amount + "');");
       ((JavascriptExecutor) driver).executeScript("document.getElementById(\"button\").click();"); 
    }
List buttons=element.findElements(By.cssSelector(“[id^=fieldButtons]”);
for(WebElement:按钮){
元素。单击();
sleep(2000)//有时我使用线程睡眠来满足简单的等待条件
((JavascriptExecutor)driver.executeScript(“document.getElementById(\“field\”).setAttribute('amount','“+amount+”);”);
((JavascriptExecutor)驱动程序)executeScript(“document.getElementById(\“button\”)。单击();”;
}

我添加了用于查找元素的代码,并且在其他地方使用了cssSelector,它似乎工作正常。您是否尝试在激活javascript和查找元素之间添加大约5秒的隐式等待?我通常用WebDriverWait设置我的元素查找,但我在你的网站上看不到。是的,我尝试过,我认为它可以找到它,因为我有一个不同的例外,当它在页面上找不到元素时。这看起来不一样,好像我需要初始化一些东西。我曾看过通过Selenium执行Javascript,但也无法实现。对于一个简单的查找抛出来说,这是一个奇怪的错误。你能分享完整的stacktrace吗?您设置了哪些web驱动程序功能?我假设您的字段出现在特定区域上,所以不要使用id来标识该元素,而是尝试使用cssSelector child或类似的同级(“div>input”)或(“div+input”);假设文本框出现在DIV标记旁边。