実装・期待動作・事象
表記の環境で Selenium をつかったブラウザ操作をしようとしています。
実装したコードは以下なのですが、
コード中、 //<- point.1
, //<- point.2
の所のように、
selenium-webdriver の Builder に対して ログ取得を有効化する設定をしていて、
Logs.get() でコンソールログを取得できると期待していました(//<- point.3
の所)。
ところが、WebDriverError
が Throw されてしまいます。 (//<- point.4
の所)
Google Chrome 環境なら、こうすれば取得できる という方法(下記 2-setFirefoxOptions-setPreference.js
に記載した方法)はあるんですが、これを Firefox で実現したく、アドバイスいただけませんでしょうか、、
↓ 3-1and2.js ↓ (オリジナルは repo 参照)
javascript
1const {Builder, Browser, Capabilities, logging} = require('selenium-webdriver'); 2const {Options} = require('selenium-webdriver/firefox'); 3 4(async () => { 5 6 var str_browserName = Browser.FIREFOX; 7 8 var obj_logPrefs = new logging.Preferences(); 9 obj_logPrefs.setLevel(logging.Type.BROWSER, logging.Level.ALL); 10 11 var obj_builder = await new Builder() 12 .withCapabilities( 13 new Capabilities() 14 .setBrowserName(str_browserName) 15 .setLoggingPrefs(obj_logPrefs) //<- point.1 16 ) 17 .setFirefoxOptions( 18 new Options() 19 .setPreference('log', 'trace') //<- point.2 20 ) 21 ; 22 23 console.log('<Content of Builder object>----------------------------------'); 24 console.log('<Builder>---------------'); 25 console.log(obj_builder); 26 console.log('<Preferences>---------------'); 27 console.log(obj_builder['capabilities_']['map_'].get('goog:loggingPrefs')); 28 console.log('<Object>---------------'); 29 console.log(obj_builder['firefoxOptions_'].get('moz:firefoxOptions')); 30 console.log('----------------------------------</Content of Builder object>'); 31 32 var obj_webDriver = obj_builder 33 .build() 34 ; 35 36 await obj_webDriver.get('https://firefox-source-docs.mozilla.org/testing/geckodriver/TraceLogs.html'); 37 38 await obj_webDriver.executeScript('console.log(\'hello console\');'); 39 40 var str_expectedString = 'hello console'; 41 var int_waitMS = 3000; 42 43 await obj_webDriver 44 .wait(async () => { 45 46 let bl_gotLog = false; 47 48 await obj_webDriver 49 .manage() 50 .logs() 51 .get(logging.Type.BROWSER) 52 .then(entries => { //<- point.3 53 entries.forEach( entry => { 54 55 console.log('[%s] %s', entry.level.name, entry.message); 56 57 if(entry.message.indexOf(str_expectedString) != (-1)){ 58 console.log("OK"); 59 bl_gotLog = true; 60 } 61 }); 62 }) 63 ; 64 65 return bl_gotLog; 66 67 },int_waitMS) 68 .catch(function(e){ //<- point.4 69 70 console.error('<exception caught!>----------------------------'); 71 72 if( (typeof e) === 'object' && e.constructor.name === "TimeoutError"){ 73 console.log("NG"); 74 75 }else{ 76 throw e; 77 } 78 }) 79 ; 80 81})();
↓ 実行結果 ↓
>node 3-1and2.js <Content of Builder object>---------------------------------- <Builder>--------------- Builder { log_: Logger { name_: 'webdriver.Builder', level_: null, parent_: Logger { name_: 'webdriver', level_: null, parent_: [Logger], handlers_: null }, handlers_: null }, url_: '', proxy_: null, capabilities_: Capabilities { map_: Map { 'browserName' => 'firefox', 'goog:loggingPrefs' => [Preferences] } }, chromeOptions_: null, chromeService_: null, firefoxOptions_: Options { map_: Map { 'browserName' => 'firefox', 'moz:firefoxOptions' => [Object] } }, firefoxService_: null, ieOptions_: null, ieService_: null, safariOptions_: null, edgeOptions_: null, edgeService_: null, ignoreEnv_: false, agent_: null } <Preferences>--------------- Preferences { prefs_: Map { 'browser' => Level { name_: 'ALL', value_: 0 } } } <Object>--------------- { prefs: { log: 'trace' } } ----------------------------------</Content of Builder object> <exception caught!>---------------------------- (node:1628) UnhandledPromiseRejectionWarning: WebDriverError: HTTP method not allowed at parseHttpResponse (C:\Users****\Desktop\q\node_modules\selenium-webdriver\lib\http.js:582:11) at Executor.execute (C:\Users****\Desktop\q\node_modules\selenium-webdriver\lib\http.js:491:26) at processTicksAndRejections (internal/process/task_queues.js:97:5) at async thenableWebDriverProxy.execute (C:\Users****\Desktop\q\node_modules\selenium-webdriver\lib\webdriver.js:700:17) at async C:\Users****\Desktop\q\3-1and2.js:59:13 (node:1628) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1) (node:1628) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
やってみたこと
//<- point.1
, //<- point.2
の設定が競合しているのかと思ったので、
以下2パターンを試してみましたが、同様に WebDriverError
が Throw されてしまいます。
//<- point.1
だけ設定して//<- point.2
は設定しない。 (repo の1-withCapabilities-setLoggingPrefs.js
)//<- point.1
は設定しないで//<- point.2
だけ設定する。(repo の2-setFirefoxOptions-setPreference.js
)
また、Chrome(80.0.3987.149) × ChromeDriver 80.0.3987.106 であれば、
//<- point.1
だけ設定して //<- point.2
は設定しない状態で、コンソールログが取得できる事を確認しました。(repo の c-1-withCapabilities-setLoggingPrefs.js
)
、、Firefox はもっと違った実装が必要なんでしょうか?
環境
Windows10 (64bit)
Node.js v12.16.1
selenium-webdriver 4.0.0-alpha.7
Firefox 74.0.1(64bit)
geckodriver 0.26.0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/19 05:58