嘲笑う、useragent javascript?
-
19-09-2019 - |
質問
を探していなければならないというニーズプログラムに変化をナビゲータuserAgentができます。私として使うため自動的に生成されたjavascriptのユニットテスターまた利用を開始fireunit.直ちに、私に叩きの壁の実際のブラウザのjavascriptのテスト。
具体的には、変更が必要なナビゲータuserAgentをシミュレーションの数百userAgent文字列が適切に検知率に与えられている関数と仮定する。ナビゲータuserAgentが読み取り専用でしかった!たいのですが模擬ナビゲータuserAgent?ユーザーエージェントスイッチャー(インストールできるスイッチFFのuseragentが、よろしくお願いいたします内でjavascript?
解決
試します:
navigator.__defineGetter__('userAgent', function(){
return 'foo' // customized user agent
});
navigator.userAgent; // 'foo'
FF2とFF3でそれを試してみました。
他のヒント
navigator.userAgent
ゲッターを再定義し、クレセント新鮮なのソリューションの上への追加(Windowsの7&マックOS X 10.6.7上)のSafari 5.0.5で動作するようには思えません。
navigator
の元userAgent
ゲッターを非表示にするには、新しいuserAgent
ゲッターをnavigator
オブジェクトから継承する新しいオブジェクトを作成して定義する必要があります:
var __originalNavigator = navigator;
navigator = new Object();
navigator.__proto__ = __originalNavigator;
navigator.__defineGetter__('userAgent', function () { return 'Custom'; });
次のソリューションは、アイフレームでも、クロム、Firefoxの、サファリ、IE9 +で動作します:
function setUserAgent(window, userAgent) {
if (window.navigator.userAgent != userAgent) {
var userAgentProp = { get: function () { return userAgent; } };
try {
Object.defineProperty(window.navigator, 'userAgent', userAgentProp);
} catch (e) {
window.navigator = Object.create(navigator, {
userAgent: userAgentProp
});
}
}
}
例:
setUserAgent(window, 'new user agent');
setUserAgent(document.querySelector('iframe').contentWindow, 'new user agent');
ミックスにいくつかのより多くのブラウザを追加する必要がありObject.definePropertyを使用します:
if (navigator.__defineGetter__) {
navigator.__defineGetter__("userAgent", function () {
return "ua";
});
} else if (Object.defineProperty) {
Object.defineProperty(navigator, "userAgent", {
get: function () {
return "ua";
}
});
}
このコードは、のFirefoxの1.5 + ののクロム6 + ののオペラ10.5 + と IE9 +で動作すべきである(試験しました) の。残念ながら、任意のプラットフォーム上のSafariはuserAgentにを変更することはできません。
編集:SafariがuserAgentにを変更することはできませんが、上記の他の溶液中で指摘したように、1つは、全体のナビゲータのオブジェクトを置き換えることができます。
三日月の新鮮なかに通知するものとします。が問題: __defineGetter__
で推奨されていません:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineGetter
推奨されていません この機能が削除されたから"。一部のブラウザでも支援での過程 れ落ちてしまいました。ご使用にならないでください旧や新規プロジェクト.ページやWebアプリ 用が切れる可能性があります。
のものを使用できる defineProperty
代わり:
Object.defineProperty(navigator, "userAgent", {
get: function () {
return "foo"; // customized user agent
}
});
navigator.userAgent; // 'foo'
これは廃止されたとして、このスレッドを更新するには、defineGetterはジャスミンにはもう動作しません。私が見つけたしかし、これは私はジャスミンにnavigator.userAgentためにゲッターを変更することができます:
navigator = {
get userAgent() {
return 'agent';
}
}
console.log(navigator.userAgent); // returns 'agent'
あなたはジャスミンでテストが終了したら、ただ、ナビゲーターオブジェクトをリセット覚えている。
活字体で同じことをやろうとしている人のために、ここソリューションです:
(<any>navigator)['__defineGetter__']('userAgent', function(){
return 'foo';
});
navigator.userAgent; // 'foo'
や言語のための同じ事ます:
(<any>navigator)['__defineGetter__']('language', function(){
return 'de-DE';
});
私は、依存性注入のアプローチを取ると思い思います。代わりに:
function myFunction() {
var userAgent = navigator.userAgent;
// do stuff with userAgent
}
たぶんような何かを行います
function myFunction(userAgent) {
// do stuff with userAgent
}
function getUserAgent() {
window.userAgentReal = +window.userAgentReal || 0;
return [ navigator.userAgent ][window.userAgentReal++];
}
function getUserAgentMock() {
window.nextUserAgentMock = +window.nextUserAgentMock || 0;
return [
'test user agent1',
'test user agent2',
'test user agent3'
][window.nextUserAgentMock++];
}
var userAgent;
while (userAgent = getUserAgent()) {
myFunction(userAgent);
}
そして、あなたが実行してgetUserAgent()
を "モック" することができます:
function getUserAgentReal() { // formerly not 'Real'
// ...
}
function getUserAgent() { // formerly 'Mock'
// ...
}
このデザインは、まだ完全に(あなたが手動テストを実行するためのゲッターの名前を変更する必要が)自動化されていない、そしてそれはnavigator.userAgent
上で動作のような単純なものに複雑の束を追加し、私はどのように」わからないんだけど実際myFunction
のいずれかのバグを特定するが、私はちょうど私があなたにこれは扱われるかもしれない方法いくつかのアイデアを与えるためにそこにそれを投げるはずと考えています。
たぶん、ここで紹介する「依存性注入」の考え方は何とかFireUnitと統合することができます。
ここではそれらのために、彼らはタイラーロングのソリューションが動作する、ユニットテストでuserAgentに値を変更する必要がありますが、初期のuserAgentを復元したり、複数回、それを変更したい場合、あなたはおそらく、設定としてプロパティを設定する必要がありますので。
function setUserAgent(userAgent) {
Object.defineProperty(navigator, "userAgent", {
get: function () {
return userAgent; // customized user agent
},
configurable: true
});
}
// Now in your setup phase:
// Keep the initial value
var initialUserAgent = navigator.userAgent;
setUserAgent('foo');
// In your tearDown:
// Restore the initial value
setUserAgent(initialUserAgent);
そうしないと、TypeError: Cannot redefine property
エラーに遭遇するかもしれません。
クロームヘッドレスで私のために動作します。
navigator.userAgent
は、読み取り専用の文字列プロパティであるので、そのことはできません、それを編集し、
答え上記はPhantomJS +活字体のために働いていませんでした。コードの下には私のために働いてます:
var __originalNavigator = navigator;
(window as any).navigator = new Object();
navigator["__proto__"] = __originalNavigator["__proto__"];
navigator["__defineGetter__"]('userAgent', function () { return 'Custom'; });
後期このトピックにはなくカルマ+ジャスミンと活字体とのために、これはそれを行いますuserAgentプロパティを設定します。
describe('should validate YYYY-MM-dd format only on IE browser', () => {
// this validator has a specific condition to work only in IE11 and down
(window as any).navigator.__defineGetter__('userAgent', function () {
return 'MSIE';
});
...
// rest of the test
});
この記事は助け: https://www.codeproject.com /ヒント/ 1036762 /モッキング-のuserAgent-と、JavaScriptのの
defineGetter経由のFirefoxやOperaに変更navigator.userAgent
navigator.__defineGetter__('userAgent', function(){
return( "iPhone 5" );
});
alert( navigator.userAgent ); //iPhone 5
オブジェクトのインスタンスを経由してIEとOperaに変更navigator.userAgent
var navigator = new Object;
navigator.userAgent = 'iPhone 5';
alert( navigator.userAgent ); //iPhone5
良いことは、あなたがIEのWebBrowserコントロールで作業している場合、あなたはなりすましの両方のHTTPリクエストとを倍増することができ、あるexecScriptを介したJavaScriptのnavigator.userAgent
WebBrowser1.Navigate "http://example.com", , , , "User-Agent: iPhone 5" & vbCrLf
WebBrowser1.Document.parentWindow.execScript ("var navigator=new Object;navigator.userAgent='iPhone 5';")
WebBrowser1.Document.parentWindow.execScript ("alert(navigator.userAgent);") 'iPhone 5
いいえ、私はあなたがJavaScriptの中でそれを行うことができます疑います。しかし、Firefoxのユーザーエージェント切り替えて、あなたが好きなユーザーエージェントのテスト、なぜちょうどそれを使用することはできません?