使用JUnit和Selenium-RC以编程方式设置凭据

时间:2011-02-14 21:34:49

标签: authentication active-directory selenium selenium-rc

我必须使用硒测试应用程序。应用程序本身针对活动目录服务器进行身份验证。所有用户帐户的格式均为“username@domain.tld”。我必须使用使用selenium java客户端库的Java JUnit(4.x)测试。

很遗憾,我无法将用户名和密码直接设置到网址中。据我所知,@符号必须在网址中编码。

selenium = new DefaultSelenium("localhost", 4444, "*chrome", "http://username%64domain.tld:password@server/appbase");

我得到的只是一些授权例外:

com.thoughtworks.selenium.SeleniumException: XHR ERROR: URL = http://username%64domain.tld:password@server/appbase/mapage Response_Code = 401 Error_Message = Unauthorized

有没有办法在网址中设置用户凭据(对于具有给定命名方案的用户)?是否有其他方式以编程方式为用户提供凭据?

提前感谢您的回答

问候,Marco

2 个答案:

答案 0 :(得分:3)

我最近研究了使用Selenium进行身份验证,并了解到由于安全原因,大多数浏览器都不赞成这样的url身份验证。

我们的解决方案(运行selenium rc 1.0.3)是在user-extensions.js中编写一个函数,用于查找登录控件(使用类名),如果找到,则插入id和密码并登录。这当然取决于使用Forms身份验证,因此请求链是:

  1. 尝试获取您的信息页
  2. 如果未登录,则重定向到登录页面
  3. 执行登录
  4. 如果经过身份验证,请重定向到您的 再次页面
  5. -

    Selenium.prototype.doTryLogin = function(locator, text ) {
    /**
    * Tries to log in into a forms authentication site
    * using the supplied locator and finding the first input[text]
    * element for login name, the first input[password] element
    * as password and the first input[submit] as submit button.
    * Use TryLoginAndWait to ensure logging in is performed before
    * next test step. 
    *
    * @param locator the DOM container for login, password and button
    * @param text part of login page name to check for
    *
    */  
    
    // Check if the user has been redirected due to authentication
    var location = this.getLocation().toLowerCase();
    
    if (location.indexOf(text) > -1) {
        this.doSetLoginName(locator + ' input[type=text]');
        this.doSetPassword(locator + ' input[type=password]');
        this.doClick(locator + ' input[type=submit]');
    }
    else {
        this.doRefresh();
    }
     }
    
    
    Selenium.prototype.doSetLoginName = function(locator, text ) {
        var element = this.page().findElement(locator);
        this.page().replaceText(element, 'your_id');
    }
    
    Selenium.prototype.doSetPassword = function(locator, text )
        var element = this.page().findElement(locator);
        this.page().replaceText(element, 'the_password');
    }
    

答案 1 :(得分:0)

Magomi,

我们最近遇到了同样的问题(包括用户名是电子邮件地址以及编码它们的必要性);

所描述的解决方案: http://wiki.openqa.org/display/SEL/Selenium+Core+FAQ#SeleniumCoreFAQ-HowdoIuseSeleniumtologintositesthatrequireHTTPbasicauthentication%28wherethebrowsermakesamodaldialogaskingforcredentials%29%3F

主要是正确的,但它有点缺乏一些细节,因此你的方法失败了。

我们得到了它:(按照你的例子): a)config / setup:只有没有凭据的selenium base url b)使用以下命令启动所有测试: 打开 http://username%64domain.tld:password@server/appbase

从那时起Selenium(实际上是当前会话中的浏览器)将发送所有后续请求,包括上述凭据,你的AUT会感觉很好; - )

关注georg

PS:在Selenium-IDE中使用上述方法仍然需要你点击弹出窗口;然而,这个弹出窗口对于最新的Selenium-RC

没有问题