質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

Q&A

1回答

4200閲覧

Node.JS SeleniumにてiOSのSafariをリモートオートメーションしたい

you_19000

総合スコア31

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

selenium

Selenium(セレニウム)は、ブラウザをプログラムで作動させるフレームワークです。この原理を使うことにより、ブラウザのユーザーテストなどを自動化にすることができます。

2グッド

0クリップ

投稿2020/01/02 15:57

編集2020/01/03 01:42

宜しくお願い致します

iPhoneでWebサイトのデバッグを行いたく、iPhone側Safariでリモートオートメーションを有効化しました
以下コードを実行すると最初の1回目は問題なく動作します。

しかし2回目実行するとErrorでSafariが一度落ち、
かつその後Safariの画面が立ち上がった状態で必ずフリーズします。
※ iPhone側はホーム画面に遷移できなくなる。ただしSafariは動く。

WebDriverが正しく終了しなかったのか?と思い、
finallyでquitを追加しましたが、改善しませんでした。

対処法をご存知の方がいらっしゃいましたらご教示いただけないでしょうか。
宜しくお願い致します

Typescript

1import { Builder } from "selenium-webdriver"; 2 3(async () => { 4 /** run webdriver */ 5 const driver = await new Builder().forBrowser("safari", undefined, "ios").build(); 6 /** browse */ 7 try { 8 await driver.get("https://google.co.jp"); 9 } finally { 10 await driver.quit(); 11 } 12})(); 13

Error

1(node:1491) UnhandledPromiseRejectionWarning: SessionNotCreatedError: Could not create a session: The session timed out while connecting to a Safari instance. 2 at Object.throwDecodedError (/Users/****/dev/ios-rpa/node_modules/selenium-webdriver/lib/error.js:550:15) 3 at parseHttpResponse (/Users/****/dev/ios-rpa/node_modules/selenium-webdriver/lib/http.js:563:13) 4 at Executor.execute (/Users/****/dev/ios-rpa/node_modules/selenium-webdriver/lib/http.js:489:26) 5 at processTicksAndRejections (internal/process/task_queues.js:93:5) 6(node:1491) 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(). (rejection id: 1) 7(node:1491) [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.

2020/01/03
頂いた内容よりコード修正(catch節追加)

TypeScript

1import { Builder, WebDriver } from "selenium-webdriver"; 2 3(async () => { 4 /** iosのsafariを指定してWebDriverを起動 */ 5 const driver: WebDriver = await new Builder().forBrowser("safari", "604.1", "ios").build(); 6 7 try { 8 9 /** ブラウザの操作を開始する */ 10 console.log("start"); 11 await driver.get("https://google.co.jp"); 12 await driver.sleep(3000); 13 /** 終了時処理 */ 14 console.log("正常終了。Driverを終了します"); 15 await driver.quit(); 16 17 } catch (e) { 18 /** Error時処理 */ 19 console.log("Errorを検知。Driverを終了します"); 20 await driver.quit(); 21 } 22})();

Error

1(node:2227) UnhandledPromiseRejectionWarning: SessionNotCreatedError: Could not create a session: The Safari instance terminated while trying to pair with it. 2 at Object.throwDecodedError (/Users/yuichiro/dev/ios-rpa/node_modules/selenium-webdriver/lib/error.js:550:15) 3 at parseHttpResponse (/Users/yuichiro/dev/ios-rpa/node_modules/selenium-webdriver/lib/http.js:563:13) 4 at Executor.execute (/Users/yuichiro/dev/ios-rpa/node_modules/selenium-webdriver/lib/http.js:489:26) 5 at processTicksAndRejections (internal/process/task_queues.js:93:5) 6(node:2227) 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(). (rejection id: 1) 7(node:2227) [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. 8yuichiro@you-2 ios-rpa % npx ts-node ./src/main.ts 9start 10正常終了。Driverを終了します
shirai, AkitoshiManabe👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

あんまり関係なしかもしれないですが
「tryがあるのにcatchがないのはおかしくないですか?」
とエラーが出ているように見えます。
タイムアウトした時のエラー処理などを書きつつ、
finallyをつけてあげるといいと思います。

多分ですが、すぐにquitすると、起動した後、体感的には何も行わずに
ブラウザが即閉じられるようになるので、
sleepを入れてみたほうがわかりやすいと思います。

投稿2020/01/02 17:29

shirai

総合スコア1290

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

you_19000

2020/01/03 01:45

ありがとうございます。 質問本文にcatch節とsleepを追加したコードを追記しました。 ただ、Errorは継続して発生しています。 微妙にError Messageは変わっていますが、このError Messageで検索しても特段現時点ではGoogle検索には引っかからないようです。 不思議なのはdriver.quit()までは進んでいるようで、quitをする瞬間に落ちているように見えています。 もしやiOSのSafariは終了の処理方法が異なる?と想像してみたのですが手掛かりとなる記事が見つかりません...
shirai

2020/01/03 09:35

そしたらsleepの後にdriver.titleをconsoleにprintしてみてください。ちゃんとgoogleと表示されるかで繋がっているかがわかります。
you_19000

2020/01/04 02:19

ありがとうございます。 以下の通りコードを修正し、実行しました。 結果としては以下の通りです。 1回目:Errorなし。タイトルGoogleも表示され、問題なく稼働することを確認。 2回目:同様のErrorが発生。(以下へ記載) ==1回目のコンソール== start Google 正常終了。Driverを終了します ==2回目のコンソール== (node:2961) UnhandledPromiseRejectionWarning: SessionNotCreatedError: Could not create a session: The Safari instance terminated while trying to pair with it. at Object.throwDecodedError (/Users/yuichiro/dev/ios-rpa/node_modules/selenium-webdriver/lib/error.js:550:15) at parseHttpResponse (/Users/yuichiro/dev/ios-rpa/node_modules/selenium-webdriver/lib/http.js:563:13) at Executor.execute (/Users/yuichiro/dev/ios-rpa/node_modules/selenium-webdriver/lib/http.js:489:26) at processTicksAndRejections (internal/process/task_queues.js:93:5) (node:2961) 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(). (rejection id: 1) (node:2961) [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. ==修正後のコード== import { Builder, WebDriver } from "selenium-webdriver"; (async () => { /** iosのsafariを指定してWebDriverを起動 */ const driver: WebDriver = await new Builder().forBrowser("safari", "604.1", "ios").build(); try { /** ブラウザの操作を開始する */ console.log("start"); await driver.get("https://google.co.jp"); await driver.sleep(3000); console.log(await driver.getTitle()); /** 終了時処理 */ console.log("正常終了。Driverを終了します"); // await driver.quit(); } catch (e) { /** Error時処理 */ console.log("Errorを検知。Driverを終了します"); // await driver.quit(); } })();
shirai

2020/01/04 08:58

1度うまくいっている以上selenium周りの問題ではなさそうですね。 お力添えできず申し訳ないですが私はお手上げです。 iOSの通信周りの設定を疑ってみてください。 私も過去にラズパイで似たようにセッション確立失敗エラーに 遭遇した時に有線に変えてあげたらうまくいったことがあります。
you_19000

2020/01/05 03:45

諸々助言いただきましてありがとうございました。 Selenium以外の環境も変えてみつつ、もう少し試験してみます。 お手数お掛け致しましてすみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問