我无法自动化一个简单的JSF登录页面,该页面需要4个输入(客户端代码,系统代码,用户和密码)并进入管理页面。以下测试对每个驱动程序的行为都不同,并且所有这些都不成功。我查看了浏览器中的html代码(查看源代码),我看到所有输入类型元素都带有正确的id。
我能够通过以下更改使代码正常运行(通过明确单击按钮提交表单而不是提交表单)。但其他司机表现出与上述相同的错误行为。
driver.findElement(By.className("af_commandButton")).click();
代码
import junit.framework.Assert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class LoginPage
{
public static void main(final String[] args)
{
// WebDriver driver = new InternetExplorerDriver();
// WebDriver driver = new HtmlUnitDriver();
WebDriver driver = new ChromeDriver();
// WebDriver driver = new FirefoxDriver();
try
{
driver.get("http://domain:port/coco/webapp/login/login.faces");
driver.findElement(By.id("clientCode")).sendKeys("coco");
driver.findElement(By.id("systemCode")).sendKeys("consumer");
driver.findElement(By.id("userId")).sendKeys("ffadmin");
driver.findElement(By.id("password")).sendKeys("password1");
driver.findElement(By.id("LoginloginForm")).submit();
// driver.findElement(By.id("login")).click();
Assert.assertTrue(driver.getPageSource().contains("Administration"));
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
driver.quit();
}
}
}
铬
错误填写如下所示的信息
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)
火狐
如下所示正确填写信息,但是当使用发布的代码提交表单时,没有任何反应,我得到了显示的异常
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.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>
答案 0 :(得分:2)
正确的方法是:
selenium.click("//button[@id='login']");
driver.findElement(By.Xpath("//button[@id='login']")).click();
我会避免使用提交表单功能,因为看起来“登录”按钮单击会触发一些自定义JavaScript,如果您使用webDriver表单提交功能,则不会触发此操作。
通过尝试单击具有特定类的按钮,您会遇到以下问题:
超过1个元素可以合法地拥有相同的类,因此您可能会点击错误的元素。 可以为元素分配多个类,如果应用了多个类并且您正在搜索单个类,它将无法始终识别您的元素,您可以使用contains函数通过XPath获取此类,但如果您有完全可服务的ID使用此策略是疯狂的,因为使用包含将再次潜在地匹配多个元素,因此您可能不会点击您希望点击的那个。
包含XPath的示例:
selenium.click("//button[contains(@class,'af_commandButton')]");
driver.findElement(By.Xpath("//button[contains(@class,'af_commandButton')]")).click();
答案 1 :(得分:1)
对于firefox,
如果您有任何提交表单的UI元素,请使用
说selenium.click("link=submit")
我认为它在提交表单后也会立即检查断言(也失败了),但页面加载需要一些时间。在表单提交后尝试延迟一些。您可以使用waitForPageToLoad()或Thread.sleep()。
此外,如果文本“管理”出现在页面上,首先首先使用xpath / css定位器检索文本,然后比较它,它将比读取整个页面源更快。
我只使用Selenium 1,但我相信你在Selenium 2驱动程序中也会有类似的功能。
<强>更新强>
selenium.click("//div[@class=\'section\']/button[@id=\'login\']") //this will click on login button. Java code for selenium 1
我希望这可行,否则使用firebug复制登录按钮的xpath / css定位器,并将其用作selenium click函数的参数。