Java 下面的selenuim 2/webdriver测试有什么问题?
我很难自动化一个简单的JSF登录页面,该页面需要4个输入(客户机代码、系统代码、用户和密码)并进入管理页面。下面的测试对每个驾驶人的表现都不同,并且所有驾驶人都不成功。我已经从浏览器(查看源代码)中查看了html代码,我看到所有输入类型元素都具有正确的id 使现代化 通过以下更改,我能够使代码在Firefox上正常工作(通过显式单击按钮而不是提交表单来提交表单)。但其他司机也表现出与上述相同的错误行为Java 下面的selenuim 2/webdriver测试有什么问题?,java,testing,selenium,webdriver,selenium-webdriver,Java,Testing,Selenium,Webdriver,Selenium Webdriver,我很难自动化一个简单的JSF登录页面,该页面需要4个输入(客户机代码、系统代码、用户和密码)并进入管理页面。下面的测试对每个驾驶人的表现都不同,并且所有驾驶人都不成功。我已经从浏览器(查看源代码)中查看了html代码,我看到所有输入类型元素都具有正确的id 使现代化 通过以下更改,我能够使代码在Firefox上正常工作(通过显式单击按钮而不是提交表单来提交表单)。但其他司机也表现出与上述相同的错误行为 driver.findElement(By.className("af_commandButt
driver.findElement(By.className("af_commandButton")).click();
代码 Chrome 错误地填写如下所示的信息 Internet Explorer
org.openqa.selenium.NoSuchElementException: Unable to find element with id == clientCode (WARNING: The server did not pr
ovide any stacktrace information)
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_24'
Driver info: driver.version: RemoteWebDriver
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:131)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:105)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:409)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:192)
at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:209)
at org.openqa.selenium.By$1.findElement(By.java:66)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:184)
at LoginPage.main(LoginPage.java:22)
org.openqa.selenium.WebDriverException: Cannot locate element used to submit form
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_24'
Driver info: driver.version: unknown
at org.openqa.selenium.htmlunit.HtmlUnitWebElement.submitForm(HtmlUnitWebElement.java:155)
at org.openqa.selenium.htmlunit.HtmlUnitWebElement.submit(HtmlUnitWebElement.java:108)
at LoginPage.main(LoginPage.java:27)
FireFox
如下图所示正确填写信息,但在提交带有发布代码的表单时,不会发生任何事情,我得到了显示的异常
Exception in thread "main" junit.framework.AssertionFailedError: null
at junit.framework.Assert.fail(Assert.java:47)
at junit.framework.Assert.assertTrue(Assert.java:20)
at junit.framework.Assert.assertTrue(Assert.java:27)
at LoginPage.main(LoginPage.java:30)
HtmlUnitDriver
org.openqa.selenium.NoSuchElementException: Unable to find element with id == clientCode (WARNING: The server did not pr
ovide any stacktrace information)
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_24'
Driver info: driver.version: RemoteWebDriver
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:131)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:105)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:409)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:192)
at org.openqa.selenium.remote.RemoteWebDriver.findElementById(RemoteWebDriver.java:209)
at org.openqa.selenium.By$1.findElement(By.java:66)
at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:184)
at LoginPage.main(LoginPage.java:22)
org.openqa.selenium.WebDriverException: Cannot locate element used to submit form
System info: os.name: 'Windows 7', os.arch: 'x86', os.version: '6.1', java.version: '1.6.0_24'
Driver info: driver.version: unknown
at org.openqa.selenium.htmlunit.HtmlUnitWebElement.submitForm(HtmlUnitWebElement.java:155)
at org.openqa.selenium.htmlunit.HtmlUnitWebElement.submit(HtmlUnitWebElement.java:108)
at LoginPage.main(LoginPage.java:27)
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html dir="ltr" lang="en-US">
<head>
<meta name="generator" content=
"HTML Tidy for Windows (vers 14 February 2006), see www.w3.org">
<meta name="generator" content="Apache Trinidad">
<link rel="stylesheet" charset="UTF-8" type="text/css" href=
"/coco/webapp/adf/styles/cache/interconnect-zcl0st-en-ltr-webkit.css">
<script type="text/javascript">
var _AdfWindowOpenError='A popup window blocker has been detected in your browser. Popup blockers interfere with the operation of this application. Please disable your popup blocker or allow popups from this site.';
</script>
<script type="text/javascript" src=
"/coco/webapp/adf/jsLibs/Common1_0_8.js">
</script>
<script type="text/javascript">
_defaultTZ()
</script>
<link rel="stylesheet" href="../skins/interconnect/trinidad-components.css"
type="text/css">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<script language="JavaScript" src="../Assets/jquery-1.3.2.min.js" type=
"text/javascript">
</script>
<script language="JavaScript" src="../Assets/vsFunctions.js" type=
"text/javascript">
</script>
<script language="JavaScript" src="../Assets/ic-script.js" type=
"text/javascript">
</script>
<script language="JavaScript" src="../Assets/timezone.js" type=
"text/javascript">
</script><!--[if lte IE 6]>
<link rel="stylesheet" type="text/css" href="../Assets/ie6fixes.css" />
<script language="JavaScript" src="../Assets/ie6-script.js"></script>
<![endif]--><!--[if IE 7]>
<link rel="stylesheet" type="text/css" href="../Assets/ie7fixes.css" />
<script language="JavaScript" src="../Assets/ie7-script.js"></script>
<![endif]-->
<script type="text/javascript" language="JavaScript">
function disableButton(inputButton)
{
inputButton.disabled=true;
}
</script>
<title></title>
</head><!-- this is a placehold for application version-->
<body onload=
"return _chain('_checkLoad()','readTimeZoneOffset()',this,event)" onunload=
"_checkUnload(event)">
<a name="top" id="top"></a><noscript>This page uses JavaScript and requires
a JavaScript enabled browser.Your browser is not JavaScript
enabled.</noscript>
<div class="main-header">
<div id="header:header-branding" class="header-branding">
<div id="header:clientbrand" class="client-brand">
<img id="header:client-image" name="header:client-image" src=
"/coco/webapp/skins/interconnect/client-logo.gif">
</div>
</div>
<form id="header:_id5" name="header:_id5" style="margin:0px" method=
"post" onkeypress="return _submitOnEnter(event,'header:_id5');" action=
"/coco/webapp/login/login.faces">
<div id="header:basebar" class="basebar">
<div id="header:finish-right-bar" class="finish-right-bar">
<ul class="navbar navBarHelp"></ul>
</div>
</div><input type="hidden" name=
"org.apache.myfaces.trinidad.faces.FORM" value="header:_id5"><span id=
"tr_header:_id5_Postscript"><input type="hidden" name=
"org.apache.myfaces.trinidad.faces.STATE" value=
"!24835796"><script type="text/javascript">
function _header__id5Validator(f,s){return true;}
</script></span><script type="text/javascript">
_submitFormCheck();
</script>
</form>
<div class="rule"></div>
</div>
<div class="main-menu">
<div class="rule"></div>
</div>
<div id="content" class="compact content split-lines">
<div class="content">
<div class="locale">
<form id="localeChanger" name="localeChanger" class="spacingDisplay"
style="margin:0px" method="post" onkeypress=
"return _submitOnEnter(event,'localeChanger');" action=
"/coco/webapp/login/login.faces">
<div class="locale-links">
<a href="#" onclick=
"submitForm('localeChanger',1,{source:'changeLocale_en'});return false;"
id="changeLocale_en" title="English version" name=
"changeLocale_en"><img id="flagUSA" src=
"/coco/webapp/Images/upgrade/flag_english.jpg" alt=
"English version" border="0" name="flagUSA"></a><a href="#"
onclick=
"submitForm('localeChanger',1,{source:'changeLocale_es'});return false;"
id="changeLocale_es" title="Spanish version" name=
"changeLocale_es"><img id="flagSPAIN" src=
"/coco/webapp/Images/upgrade/flag_spanish.jpg" alt=
"Spanish version" border="0" name="flagSPAIN"></a><a href="#"
onclick=
"submitForm('localeChanger',1,{source:'changeLocale_fr'});return false;"
id="changeLocale_fr" title="French version" name=
"changeLocale_fr"><img id="flagFRANCE" src=
"/coco/webapp/Images/upgrade/flag_french.jpg" alt=
"French version" border="0" name="flagFRANCE"></a><a href="#"
onclick=
"submitForm('localeChanger',1,{source:'changeLocale_pt'});return false;"
id="changeLocale_pt" title="Portuguese version" name=
"changeLocale_pt"><img id="flagBRASIL" src=
"/coco/webapp/Images/upgrade/flag_portuguese.jpg" alt=
"Portuguese version" border="0" name="flagBRASIL"></a>
</div><input type="hidden" name=
"org.apache.myfaces.trinidad.faces.FORM" value=
"localeChanger"><span id="tr_localeChanger_Postscript"><input type=
"hidden" name="org.apache.myfaces.trinidad.faces.STATE" value=
"!24835796"><script type="text/javascript">
function _localeChangerValidator(f,s){return true;}
</script></span><script type="text/javascript">
_submitFormCheck();
</script>
</form>
</div>
<form id="LoginloginForm" name="LoginloginForm" class="spacingDisplay"
style="margin:0px" method="post" onkeypress=
"return _submitOnEnter(event,'LoginloginForm','login');" action=
"/coco/webapp/login/login.faces">
<h1 class="pageTitle">
User Authentication
</h1>
<div class="wizard">
<div class="section">
<div class="content">
<div class="input">
<div class="field">
<span class="label"><label for="clientCode">Client
Code</label></span>
<div class="content">
<script type="text/javascript">
var _locale='en-US';var _tLocale='en-US';
</script><script type="text/javascript" src=
"/coco/webapp/adf/jsLibs/resources/LocaleElements_en_US1_0_8.js?loc=en_US">
</script><span class="af_inputText p_AFRequired"><input id="clientCode"
name="clientCode" class="af_inputText_content" size="30"
maxlength="20" type="text"></span>
</div>
</div>
<div class="field">
<span class="label"><label for="systemCode">System
Code</label></span>
<div class="content">
<span class="af_inputText p_AFRequired"><input id=
"systemCode" name="systemCode" class=
"af_inputText_content" size="30" maxlength="20" type=
"text"></span>
</div>
</div>
<div class="field">
<span class="label"><label for="userId">User
Id</label></span>
<div class="content">
<span class="af_inputText p_AFRequired"><input id=
"userId" name="userId" class="af_inputText_content" size=
"30" maxlength="20" type="text"></span>
</div>
</div>
<div class="field">
<span class="label"><label for=
"password">Password</label></span>
<div class="content">
<span class="af_inputText p_AFRequired"><input id=
"password" name="password" onkeydown=
"return _clearPassword(this, event);" class=
"af_inputText_content" size="30" maxlength="20" type=
"password"></span>
</div>
</div>
</div><img class="wizard-graphic" src=
"../Images/upgrade/safe_box.jpg">
<div class="section">
<button id="login" name="login" type="button" onclick=
"submitForm('LoginloginForm',1,{source:'login'});return false;"
class="action af_commandButton">Log In</button><button id=
"forgotPassword" name="forgotPassword" type="button" class=
"action af_goButton" onclick=
"document.location='../forgotpassword/ForgotPassword.faces'">Password
Help</button>
</div>
</div>
</div>
</div>
<div class="legalNoticeLogin">
<div class="section">
<div class="content">
<div id="legalCopy" class="copy">
<div class="xcopy af_outputDocument">
<p class="af_outputDocument_paragraph">
<b>IMPORTANT - READ CAREFULLY</b>
</p>
<p class="af_outputDocument_paragraph">
The private Web site you are about to enter
</p>
</div>
</div>
</div>
</div>
</div><input type="hidden" name=
"org.apache.myfaces.trinidad.faces.FORM" value=
"LoginloginForm"><span id="tr_LoginloginForm_Postscript"><input type=
"hidden" name="org.apache.myfaces.trinidad.faces.STATE" value=
"!24835796"><script type="text/javascript">
function _LoginloginFormValidator(f,s){return true;}
</script></span><script type="text/javascript">
_submitFormCheck();
</script>
</form>
</div>
</div>
</body>
</html>
var_AdfWindowOpenError='在浏览器中检测到弹出窗口阻止程序。弹出窗口阻止程序会干扰此应用程序的操作。请禁用弹出窗口阻止程序或允许从此网站弹出窗口。“;
_defaultTZ()
功能禁用按钮(inputButton)
{
inputButton.disabled=true;
}
函数_localeChangerValidator(f,s){返回true;}
_submitFormCheck();
用户身份验证
客户
密码
var_locale='en-US';var_tLocale='en-US';
系统
密码
使用者
身份证件
暗语
登录密码
帮助
重要事项-仔细阅读
您将要进入的专用网站
函数_LoginloginFormValidator(f,s){返回true;}
_submitFormCheck();
对于firefox
如果您有任何提交表单的UI元素,请使用该元素
说selenium。单击(“link=submit”)
我认为它会在提交表单后立即检查断言(表单也失败了),但页面加载需要一些时间。尝试在表单提交后延迟一些时间。您可以使用waitForPageToLoad()或Thread.sleep()
另外,如果文本“Administration”出现在页面上,首先使用xpath/css定位器检索文本,然后进行比较,这将比读取整个页面源代码更快
我只在Selenium 1上工作过,但我相信在Selenium 2驱动程序中也会有类似的功能
更新
selenium。单击(“//div[@class=\'section\']]/按钮[@id=\'login\']”//这将单击登录按钮。selenium 1的Java代码
我希望这能起作用,否则请使用firebug复制登录按钮的xpath/css定位器,并将其用作selenium click函数的参数。正确的方法如下:
selenium.click("//button[@id='login']");
driver.findElement(By.Xpath("//button[@id='login']")).click();
我会避免使用提交表单功能,因为它看起来像是登录按钮点击触发了一些定制的JavaScript,如果您使用webDriver表单提交功能,就不会触发它 尝试单击具有特定类的按钮会导致以下问题: 多个元素可以合法地拥有相同的类,因此您可能单击了错误的元素。 可以将多个类分配给一个元素,如果应用了多个类,并且您正在搜索单个类,则它不会始终识别您的元素,您可以通过使用contains函数使用XPath来实现这一点,但是,如果您有一个完全可服务的ID,那么使用此策略是疯狂的,因为使用contains会再次潜在地匹配多个元素,因此您可能不会单击您希望单击的元素 包含XPath的示例:
selenium.click("//button[contains(@class,'af_commandButton')]");
driver.findElement(By.Xpath("//button[contains(@class,'af_commandButton')]")).click();
你能给我们看一下它试图对抗的完整html吗?你的页面上可能有几个id相同的元素吗?@Tim Koopmans-添加了生成的html@Carlosz-不,ID不重复…我已将html添加到问题nowthx中,以供回答。我已经发布了html…你能看看它并建议什么是提交响应的最佳方式吗“登录按钮点击会触发一些定制JavaScript,如果你使用webDriver表单提交功能,你不会触发它。”你能告诉我这是在哪里记录的吗。这不是Selenium问题,这是一个了解浏览器如何工作的问题。提交表单是一个HTTP函数,而不是JavaScript函数。您不需要启用JavaScript就可以发布文章/