小编Fil*_*ero的帖子

使用Selenium WebDriver读取JavaScript变量

我正在使用Selenium WebDriver(Java)和TestNG在我创建的网站上进行一些测试.在这个网站上,我也有JavaScript,在一些函数中,它返回值并通过输出值输出到浏览器控制台console.log().

我想知道Selenium WebDriver是否有一种简单的方法可以访问这些JavaScript信息,因此我可以使用TestNG执行断言.

我对Selenium很新,但我知道你可以这样做:

WebDriver driver = new ChromeDriver();
driver.findElement(By.id("btn")).click();
Run Code Online (Sandbox Code Playgroud)

那么我可以用什么类似的东西WebDriver来阅读网站上的JavaScript?


澄清

看起来人们假设我正试图通过Selenium"执行"JavaScript代码.

不是这样的.相反,我正在尝试使用Selenium存储已定义的JavaScript变量.

基本上,我希望Selenium能够获取JavaScript变量的值,将其存储在本地,然后对其进行断言测试.


尝试1

说我的网站有以下JS代码:

$(document).ready(function() {
    var foo = $(#"input-field-val").val();

    function returnFoo() {
        return foo;
    }
});
Run Code Online (Sandbox Code Playgroud)

根据我的阅读和理解,在我单独的Selenium测试文件(Selenium.java)中,我应该可以做这样的事情吗?:

public class Selenium {
    WebDriver driver = new FirefoxDriver();
    JavascriptExecutor js = (JavascriptExecutor) driver;

    @Test
    public void testSample() {
        driver.get("www.mywebsite.com");
        js.executeScript("alert(returnFoo());");
    }
}
Run Code Online (Sandbox Code Playgroud)

我做了类似于上面的事情,但没有弹出警报框.相反,我收到一条错误消息:

Exception in thread "main" org.openqa.selenium.WebDriverException: ReferenceError: returnFoo is not defined
Run Code Online (Sandbox Code Playgroud)

当我说JS变量时,我很确定我不明白它意味着什么

不应该是闭包或局部变量的一部分

我也尝试在上面定义一个全局变量,$(document).ready(function()...并且设置在function returnFoo()但仍然不起作用.


尝试2

我已经移动了两个 …

javascript testng selenium selenium-webdriver

53
推荐指数
3
解决办法
8万
查看次数

如何在使用API​​密钥时跳过Devise身份验证?

我正在我的应用程序上使用Devise,并希望创建一个全局API密钥,可以访问任何人的帐户的JSON数据,而无需登录.

例如,假设我的API密钥是1234,我有两个用户创建了两个不同的餐厅.

  • 用户1 - 餐厅1(/餐厅/ 1)
  • 用户2 - 餐厅2(/餐厅/ 2)

我打开一个全新的浏览器,没有登录任何东西,我传入我的URL .../restaurants/2.json?api_key=1234,我应该能够访问该餐厅的JSON数据,而无需登录用户2

什么是最好的方法呢?

我已经按照Railscast#352保护API,所以我可以通过传入API密钥来访问JSON的东西,但我必须登录才能看到任何内容.

编辑1:使用CanCan

我应该提一下,我也在使用CanCan作为角色,但不确定在这种情况下是否会扮演任何角色(双关语).

编辑2:使用API​​版本控制

我按照Railscast#350和#352教你如何创建REST API版本以及如何使用API​​密钥保护它.

这是我的controllers/api/v1/restaurants/restaurants_controller.rb的样子:

module Api
  module V1
    class RestaurantsController < ApplicationController
      before_filter :restrict_access

      respond_to :json

      def index
        respond_with Restaurant.all
      end

      def show
        respond_with Restaurant.find(params[:id])
      end

    private

      def restrict_access
        api_key = ApiKey.find_by_access_token(params[:api_key])
        head :unauthorized unless api_key        
      end
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

application_controller.rb仍然有before_filter :authenticate_user!代码.

我首先在REST API版本控制上遵循Railscast#350并将所有JSON API调用移到/apps/api/v1/...

然后,遵循下面的Steve Jorgensen的解决方案,确保我的API模块继承ActionController::Base …

authentication api json ruby-on-rails devise

12
推荐指数
4
解决办法
2万
查看次数

错误修复后仍然"无法从SCDynamicStore加载领域信息"

我安装HadoopPig使用brew install hadoopbrew install pig.

在这里读到你将收到Unable to load realm info from SCDynamicStore错误信息,除非你添加:

export HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"
Run Code Online (Sandbox Code Playgroud)

到你的hadoop-env.sh文件,我有.

但是,当我跑步时hadoop namenode -format,我仍然看到:

java[1548:1703] Unable to load realm info from SCDynamicStore
Run Code Online (Sandbox Code Playgroud)

在产出中.

任何人都知道为什么我还能得到它?

homebrew hadoop apache-pig

11
推荐指数
2
解决办法
1万
查看次数

MockWebServer的takeRequest()方法需要很长时间才能响应或挂起

我在Android JUnit测试中使用MockWebServer库.我正在测试一个调用服务器的SDK.所以我正在使用MockWebServer覆盖这些服务器URL并捕获SDK发送的内容以对其进行断言.

我遇到的问题是,如果我尝试server.takeRequest()将其分配给一个新RecordedRequest变量,那么测试会挂起第二个server.takeRequest(),有时甚至是第一个 - 如果我在模拟器上运行它会挂起第server.takeRequest()一种方法,但如果我在我的物理Android设备上运行它,它会冻结第二种方法server.takeRequest()方法.

public void testSomething() {
  final MockWebServer server = new MockWebServer();

  try {
    server.play();
    server.enqueue(new MockResponse().setBody("")
      .setResponseCode(HttpURLConnection.HTTP_INTERNAL_ERROR));
    server.enqueue(new MockResponse().setBody("")
      .setResponseCode(HttpURLConnection.HTTP_OK));
    server.enqueue(new MockResponse().setBody("")
      .setResponseCode(HttpURLConnection.HTTP_OK));

    URL url = server.getUrl("/");
    // This internal method overrides some of the hardcoded URLs 
    // within the SDK that I'm testing.
    Util.overrideUrls(url.toString()) 

    // Do some server calls via the SDK utilizing the mock server url.

    RecordedRequest requestFor500 = server.takeRequest(); …
Run Code Online (Sandbox Code Playgroud)

java junit android mocking mockwebserver

9
推荐指数
2
解决办法
2558
查看次数

获取"错误:字符串"不是有效的BCrypt哈希."在Mocha ExpressJS测试期间抛出了一个错误:)"

我有一个使用Passport进行身份验证的MEAN堆栈应用程序.

我正在尝试编写一个登录的单元测试,并检查是否重定向到root(/).但是,每当我运行Mocha时,我都会收到以下错误消息:

1) POST /home Login test should redirect to / after login:
   Error: the string "Not a valid BCrypt hash." was thrown, throw an Error :)
Run Code Online (Sandbox Code Playgroud)

这是我的单元测试LoginSpec.js:

var should = require("should");
var app = require("../app");
var mongoose = require("mongoose");
var User = mongoose.model("User");
var request = require("supertest");
var agent = request.agent(app);
...
describe('POST /home', function() {
    before(function(done) {
        user = new User({
            email: "john@email.com",
            firstName: "John",
            lastName: "Doe",
            password: "strongPassword",
            username: "johndoe"
        });

        user.save(done);
    }) …
Run Code Online (Sandbox Code Playgroud)

mocha.js node.js express supertest passport.js

7
推荐指数
1
解决办法
6644
查看次数

java.lang.NoSuchMethodError org.apache.http.client.utils.URLEncodedUtils.encPath

我正在尝试使用Apache HTTP Client库在Android中发出GET请求,但是当我尝试发出请求时,我得到了以下的堆栈跟踪.

06-17 16:19:58.891  10605-10605/com.myapp.test.android E/SELinux? selinux_android_seapp_context_reload: seapp_contexts file is loaded from /data/security/spota/seapp_contexts
06-17 16:19:58.891  10605-10605/com.myapp.test.android D/dalvikvm? Late-enabling CheckJNI
06-17 16:19:59.001  10605-10605/com.myapp.test.android I/dalvikvm? Could not find method org.apache.http.client.utils.URLEncodedUtils.encPath, referenced from method org.apache.http.client.utils.URIBuilder.encodePath
06-17 16:19:59.001  10605-10605/com.myapp.test.android W/dalvikvm? VFY: unable to resolve static method 2455: Lorg/apache/http/client/utils/URLEncodedUtils;.encPath (Ljava/lang/String;Ljava/nio/charset/Charset;)Ljava/lang/String;
06-17 16:19:59.001  10605-10605/com.myapp.test.android D/dalvikvm? VFY: replacing opcode 0x71 at 0x0002
06-17 16:19:59.001  10605-10605/com.myapp.test.android I/dalvikvm? Could not find method org.apache.http.client.utils.URLEncodedUtils.encUric, referenced from method org.apache.http.client.utils.URIBuilder.encodeUric
06-17 16:19:59.001  10605-10605/com.myapp.test.android W/dalvikvm? VFY: unable to resolve static method 2456: …
Run Code Online (Sandbox Code Playgroud)

java android apache-httpclient-4.x

6
推荐指数
1
解决办法
8117
查看次数

如何使用Sequelize ORM"包含"两个相同模型的单独引用?

我正在使用MEAN堆栈构建一个网站,但用PostGRES替换MongoDB,结果使用Sequelize ORM.

我有两个型号 - UserAudioConfig.一个User可以有很多AudioConfigAudioConfig属于一个UsercreatedByupdatedBy.

以下是我的协会使用Sequelize的方式

models.User.hasMany(models.AudioConfig, {
  foreignKey: {
    name: 'createdBy',
    allowNull: false
  }
});
models.User.hasMany(models.AudioConfig, {
  foreignKey: {
    name: 'updatedBy'
  }
});
models.AudioConfig.belongsTo(models.User, {
  foreignKey: {
    name: 'createdBy',
    as: 'createdBy',
    allowNull: false
  }
});
models.AudioConfig.belongsTo(models.User, {
  foreignKey: {
    name: 'updatedBy',
    as: 'updatedBy'
  }
});
Run Code Online (Sandbox Code Playgroud)

在我的findAll查询中AudioConfig,我尝试了几种与我在网上找到的不同,但似乎没有像我期望的那样工作:

var Db = require('../../models');
var entityModel = Db.AudioConfig;

exports.index = function (req, res) { …
Run Code Online (Sandbox Code Playgroud)

sequelize.js

5
推荐指数
1
解决办法
4066
查看次数

http.get 中的 .catch() 未捕获 HTTP 500 错误代码

在我的 Angular 2 应用程序中,我有一个带有http.get返回 Observable 方法的服务。

\n\n

活动.service.ts

\n\n
public getCampaign(campaignId: string): Observable<Campaign> {\n  return this.http.get(this.campaignsUrl + \'/\' + campaignId, options)\n    .map(this.extractData)\n    .catch(this.handleError);\n}\n\nprivate extractData(res: Response) {\n  let body = res.json();\n  return body.data || body || {};\n}\n\nprivate handleError(error: Response | any) {\n  // In a real world app, we might use a remote logging infrastructure\n  let errMsg: string;\n  if (error instanceof Response) {\n    const body = error.json() || \'\';\n    const err = body.error || JSON.stringify(body);\n    errMsg = `${error.status} - …
Run Code Online (Sandbox Code Playgroud)

observable angular

4
推荐指数
1
解决办法
7132
查看次数

搜索String数组以查找子字符串的最有效方法

假设我有一个字符串数组,如下所示:

0 ["Some plain text"]
1 ["Foobar chicken"]
Run Code Online (Sandbox Code Playgroud)

我想在每个String(在数组的每个索引中)搜索特定的子字符串,比如说plain,然后true在找到子字符串的第一个实例时返回.

这样做最有效的方法是什么?

我知道我可以break在for循环中做一个简单的但是我听说有人说break在for循环中使用是不好的做法.我还听说,使用whiledo-while也不好.

我的实施

这是我使用break的简单实现:

for (String[] index : tmpList) {
    retVal = index[2].toLowerCase().contains(keyword);

    if (retVal) // Break when retVal is true
        break;
}
Run Code Online (Sandbox Code Playgroud)

哪里:

  • tmpList 是一个 ArrayList<String[]>
  • keyword 是我想要找到的

java arrays substring

3
推荐指数
1
解决办法
5367
查看次数

如何在Gradle中向版本名称添加产品风味

我有一个Android Gradle项目,有多种风格,如此.

android {
    ...
    productFlavors {
        apple {
            applicationId "com.myapp.apple"
        }

        orange {
            applicationId "com.myapp.orange"
        }

        banana {
            applicationId "com.myapp.banana"
        }
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

在我的build.gradle我也有下面的代码片段,如果它是本地构建,则设置versionName0.8-dev,如果是Jenkin的构建,则设置为0.8-123.

android {
    ...
    defaultConfig {
        ...
        // Get the build number from Jenkins, otherwise use 'dev'
        ext.buildNumber = System.getenv("BUILD_NUMBER") ?: "dev"
        versionName "0.8-$buildNumber"
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

由于我现在对同一个项目有不同的风格,我想给versionName它加上风味的前缀,所以它看起来像这个apple-0.8-devorange-0.8-dev,这取决于它的味道.

我该怎么做呢?

我尝试过使用BuildConfig.FLAVOR但我无法访问build.gradle.

android gradle build.gradle android-gradle-plugin

3
推荐指数
1
解决办法
3162
查看次数

使用WebDriver更改URL

我正在使用Selenium WebDriver(Java),并试图在WebDriver登录到页面后更改URL。

有没有一种方法可以:

  1. 更改当前窗口的URL,或
  2. 打开一个新选项卡,然后转到另一个页面。

谢谢!

java selenium-webdriver

1
推荐指数
1
解决办法
2万
查看次数

即使在"保持类"标志之后,ProGuard也会对类进行模糊处理.影响Android WebView行为

我正在使用ProGuard来混淆我的Android应用.

我还WebView用来显示一个网页(一个HTML演练页面),其中包含一个关闭该按钮的按钮WebView.Javascript中有一个函数可以回调一个closeWalkthrough()方法:

function closeFunction()
{
    MyClass.closeWalkthrough();
}
Run Code Online (Sandbox Code Playgroud)

相关的Java类看起来像这样:

package com.myclass.android;

import android.app.Activity;
import android.content.Context;
import android.webkit.JavascriptInterface;

public class JavaScriptInterface {

    Context _context;

    JavaScriptInterface(Context context) {
        _context = context;
    }

    @JavascriptInterface
    public void closeWalkthrough() {
        ((Activity) _context).finish();
    }
}
Run Code Online (Sandbox Code Playgroud)

我在我的ProGuard文件中添加了以下标志,希望它不会混淆JavaScriptInterface类,因为如果我理解正确,Javascript方法MyClass.closeWalkthrough()正在寻找closeWalkthrough()我的JavaScriptInterfaceJava类中找到的.

...
-keepattributes JavascriptInterface
-keep public class com.myclass.android.JavaScriptInterface { *; }
...
Run Code Online (Sandbox Code Playgroud)

但是,每当我查看我的mapping.txt文件时,我都会看到它com.myclass.android.JavaScriptInterface被混淆:

...
com.myclass.android.JavaScriptInterface -> axf:
    android.content.Context _context -> a
...
Run Code Online (Sandbox Code Playgroud)

我甚至-keep …

java android proguard android-webview

1
推荐指数
1
解决办法
2040
查看次数

使用FormBuilder在Angular 2中从异步调用设置默认表单对象值

我正在使用"@angular/forms": "~2.1.0"and "angular-cli": "1.0.0-beta.19-3"并且在我进行异步调用以获取列表之后尝试设置my FormGroup(s campaignForm) campaign_config_id属性的默认值campaignConfigs.

我已经尝试使用以下其他SO建议,但我明白了TypeError: _this.campaignForm.controls.campaign_config_id.updateValue is not a function.

this.campaignConfigService.getCampaignConfigs()
  .subscribe(
    campaignConfigs => {
      ...
      this.campaignForm.controls['campaign_config_id'].updateValue(campaignConfigs[0].id)
    }
  );
Run Code Online (Sandbox Code Playgroud)

我也试着铸造this.campaignForm.controls['campaign_config_id']NgControl,FormControl,SelectControlValueAccessor和其他对象,但他们都没有的.updateValue功能.

关于如何做到这一点的任何建议?

angular2-formbuilder angular

1
推荐指数
1
解决办法
1220
查看次数