Что не так с тестом selenuim 2 / webdriver, приведенным ниже? - PullRequest
0 голосов
/ 02 мая 2011

У меня проблемы с автоматизацией простой страницы входа в систему JSF, которая принимает 4 ввода (код клиента, системный код, пользователя и пароль) и переходит на страницу администрирования. Приведенный ниже тест ведет себя по-разному с каждым из драйверов, и все они неуспешны. Я посмотрел HTML-код из браузера (просмотр источника) и вижу, что все элементы типа ввода присутствуют с правильными идентификаторами.

UPDATE

Мне удалось заставить код корректно работать с Firefox с изменением ниже (отправка формы путем явного нажатия на кнопку вместо отправки формы). Но другие драйверы показывают такое же ошибочное поведение, как описано.

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();
        }
    }
}

Chrome

Неправильно заполняется информация, как показано ниже

enter image description here

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)

FireFox

Заполняет информацию правильно, как показано ниже, но ничего не происходит, когда форма отправляется с опубликованным кодом, и я получаю показанное исключение

enter image description here

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>

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

Правильный способ сделать это будет одним из следующих:

selenium.click("//button[@id='login']");
driver.findElement(By.Xpath("//button[@id='login']")).click();

Я бы не стал использовать функцию отправки формы, потому что похоже, что нажатие кнопки «Вход» запускает какой-то настроенный JavaScript, вы выигралине запускайте его, если вы используете функцию отправки формы webDriver.

Пытаясь нажать на кнопку с определенным классом, вы вызываете у себя следующие проблемы:

Более 1 элемента могут легальноиметь тот же класс, так что вы можете нажать на неправильный элемент.Элементу может быть назначено несколько классов, если применяется более одного класса, и вы ищете один класс, он не всегда распознает ваш элемент, вы можете получить это с помощью XPath с помощью функции contains, но если у вас естьидеально обслуживаемый идентификатор - это безумие, если использовать эту стратегию, так как использование содержимого снова потенциально может соответствовать нескольким элементам, поэтому вы не можете щелкнуть по элементу, на который вы ожидаете нажать.

Пример содержимого с XPath:

selenium.click("//button[contains(@class,'af_commandButton')]");
driver.findElement(By.Xpath("//button[contains(@class,'af_commandButton')]")).click();
1 голос
/ 02 мая 2011

Для Firefox,

Если у вас есть какой-либо элемент пользовательского интерфейса, который отправляет форму, пожалуйста, используйте

скажем 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 кнопки входа в систему и используйте его в качестве аргумента для функции щелчка селена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...