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

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

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

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

selenium

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

Q&A

1回答

1548閲覧

Electronでseleniumを使いたいのですが、起動できません。

apeirogon0813

総合スコア117

Electron

Electronは、HTML5とNode.jsというWebの技術を用いてデスクトップアプリケーションを作成できるクロスプラットフォームな実行環境です。

npm

npmは、Node Packaged Modulesの略。Node.jsのライブラリ・パッケージを管理できるツールです。様々なモジュールを簡単にインストールでき、自分でモジュールを作成し公開する際にも使用できます。

selenium

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

0グッド

0クリップ

投稿2020/09/10 08:44

編集2020/11/12 22:26

GUIを用いて、seleniumを使えるように
Electron上でseleniumを実行したく、
こちらのサイトを参考にして、WebDriverJsの設定を用いて、実行しましたが、以下のようなエラーがでて起動しません。

$ npx electron ./src (node:97726) UnhandledPromiseRejectionWarning: Error: ECONNREFUSED connect ECONNREFUSED 127.0.0.1:9515 at ClientRequest.<anonymous> (/Users/s_o813/Desktop/Electron/test2/node_modules/selenium-webdriver/http/index.js:262:15) at ClientRequest.emit (events.js:310:20) at Socket.socketErrorListener (_http_client.js:426:9) at Socket.emit (events.js:310:20) at emitErrorNT (internal/streams/destroy.js:92:8) at emitErrorAndCloseNT (internal/streams/destroy.js:60:3) at processTicksAndRejections (internal/process/task_queues.js:84:21) (node:97726) 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:97726) [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.

コードは以下のようになります。

main.js

1// アプリケーション作成用のモジュールを読み込み 2const { app, BrowserWindow } = require("electron"); 3 4const webdriver = require("selenium-webdriver"); 5 6// メインウィンドウ 7let mainWindow; 8 9function createWindow() { 10 // メインウィンドウを作成します 11 mainWindow = new BrowserWindow({ 12 webPreferences: { 13 nodeIntegration: true, 14 }, 15 width: 800, 16 height: 600, 17 }); 18 19 // メインウィンドウに表示するURLを指定します 20 // (今回はmain.jsと同じディレクトリのindex.html) 21 mainWindow.loadFile("index.html"); 22 23 // デベロッパーツールの起動 24 mainWindow.webContents.openDevTools(); 25 26 const driver = new webdriver.Builder() 27 // The "9515" is the port opened by chrome driver. 28 .usingServer("http://localhost:9515") 29 .withCapabilities({ 30 chromeOptions: { 31 // Here is the path to your Electron binary. 32 binary: "/Users/xxx/Desktop/Electron/test2", 33 }, 34 }) 35 .forBrowser("electron") 36 .build(); 37 38 driver.get("http://www.google.com"); 39 driver.findElement(webdriver.By.name("q")).sendKeys("webdriver"); 40 driver.findElement(webdriver.By.name("btnG")).click(); 41 driver.wait(() => { 42 return driver.getTitle().then((title) => { 43 return title === "webdriver - Google Search"; 44 }); 45 }, 1000); 46 47 // メインウィンドウが閉じられたときの処理 48 mainWindow.on("closed", () => { 49 mainWindow = null; 50 }); 51} 52 53// 初期化が完了した時の処理 54app.on("ready", createWindow); 55 56// 全てのウィンドウが閉じたときの処理 57app.on("window-all-closed", () => { 58 // macOSのとき以外はアプリケーションを終了させます 59 if (process.platform !== "darwin") { 60 app.quit(); 61 } 62}); 63// アプリケーションがアクティブになった時の処理(Macだと、Dockがクリックされた時) 64app.on("activate", () => { 65 // メインウィンドウが消えている場合は再度メインウィンドウを作成する 66 if (mainWindow === null) { 67 createWindow(); 68 } 69});

上記はこちらのサイトを元にselenium部分を追加しました。

ご教示願います。

python

1import random 2import networkx as nx 3import matplotlib.pyplot as plt 4import copy 5 6#要素が重複しているか 7def has_duplicates(seq): 8 return len(seq) == len(set(seq)) 9 10def create_volumes(n): 11 #重複しないレコードの作成 12 V = random.sample(range(5,260), k=n) 13 #観測されるボリューム集合の生成 14 W = copy.copy(V) 15 for i in range(N-1): 16 W.append(V[i]+V[i+1]) 17 return V, W 18 19#候補解から生成されるボリュームを観測したボリュームと比較 20def compare_volumes(S, W): 21 T = set() 22 #観測されるボリューム集合の生成 23 for s in S: 24 w = copy.copy(s) 25 for i in range(N-1): 26 w.append(s[i]+s[i+1]) 27 if set(w) == set(W): 28 #print(tuple(s)) 29 T.add(tuple(s)) 30 return T 31 32 33#1つ以上重複しているボリュームを作成(レコードは重複していない) 34def create_duplicates(n): 35 data = create_volumes(n) 36 if has_duplicates(data[1]): #重複していないならば 37 return create_duplicates(n) 38 else: 39 return data 40 41def create_no_duplicates(n): 42 data = create_volumes(n) 43 #print(data[1]) 44 if has_duplicates(data[1]): 45 return data 46 else: 47 return create_duplicates(n) 48 49 50Ans = [] 51N = 26 #攻撃者は既知 52result = create_duplicates(N) 53#result = create_no_duplicates(N) 54V = result[0] #復元したいレコード 55print("V = " + str(V)) 56print("W = " + str(result[1])) 57W = list(set(result[1])) #攻撃者が観測するボリュームの集合 58 59 60#要素を昇順に 61W.sort() 62print("昇順W = " + str(W) + " ( |W| = " + str(len(W)) +" )") 63 64G = nx.Graph() 65#step1 2頂点の和がボリュームに含まれているのならエッジを追加 66#連結しているて頂点のみをエッジごと抽出 67n = len(W) 68for i in range(n-2): 69 for j in range(i+1,n-1): 70 if W[i] + W[j] in W: 71 G.add_edge(W[i], W[j]) 72 73print("存在する枝 = " + str(G.edges)) 74print("抽出されたボリューム(" + str(len(G.nodes)) +"/" + str(len(W)) +") = " + str(G.nodes)) 75print(list(G.neighbors(W[0]))) 76 77#step2 確定レコード選別する 78RNodes = [W[0], W[1]] #レコードは重複しない仮定より1,2番目に小さいボリュームはレコードである 79for i in range(2, N): 80 for j in range(i): 81 #print("W[i] - W[j] = " + str(W[i]) + " - " + str(W[j])) 82 if W[i] - W[j] in W and W[i] != 2 * W[j] : #あるボリュームが確定レコード同士の和である時(その要素が隣同士orレコードであるor両方) 83 break 84 #else: 和でない場合は次に進める 85 #最終的にそのボリュームを生成する確定レコードの2要素の和が存在しない場合、そのボリューム確定レコード 86 if j == i-1: 87 RNodes.append(W[i]) 88 89print("確定レコード = " + str(RNodes)) 90 91 92 93#step3 確定レコードである頂点を通る経路長=N-1である経路 94S = [] 95#//集合の中にリストの集合 96l = list(G.neighbors(W[0])) 97 98for i in l: #一次元配列だとループが回せないため、二次元配列にしておく 99 S.append([W[0],i]) 100 101def right_shift(S,G): 102 #print("S = " + str(S)) 103 for i in range(N-2): #解の長さがNになるまで 104 T = [] 105 for s in S: #解の数 106 if len(s) != N: 107 right_num = len(s) - 1 108 l = list(G.neighbors(s[right_num]))#一番右の要素と隣合うノードを取得 109 for node in l: 110 if node not in s: #同じレコードは存在しないかの判定 111 C = copy.copy(s) 112 C.append(node) 113 if C not in T: 114 T.append(C) 115 T.append(s)#右に拡張できるがそのノードが終点である可能性があるため 116 #print(T) 117 S = copy.copy(T) 118 #print("S = " + str(S)) 119 return S 120 121#S = right_shift(S) 122 123#左に拡張 124def left_shift(S,G): 125 for i in range(N-2): 126 T = [] 127 for s in S: 128 #print("s = " + str(s)) 129 if len(s) != N: 130 l = list(G.neighbors(s[0])) 131 for node in l: 132 if node not in s: #同じレコードは存在しないかの判定 133 C = copy.copy(s) 134 C.insert(0,node) #先頭に要素を追加 135 if C not in T: 136 T.append(C) 137 T.append(s) 138 S = copy.copy(T) 139 #print("s = " + str(S)) 140 return S 141 142#step4 確定コードが解に含まれているか 現段階では確定レコードを通る効率的なアルゴリズムが考えられていないため 143def confirm(S): 144 T = [] 145 for s in S: 146 if len(s) == N: 147 for i in range(len(RNodes)): 148 if RNodes[i] not in s: 149 break 150 if i == len(RNodes)-1: 151 T.append(s) 152 return T 153T = copy.copy(S) 154T = right_shift(T,G) 155T = left_shift(T,G) 156S = left_shift(S,G) 157S = right_shift(S,G) 158#print("解候補 = " + str(T)) 159print("解の数1 = " + str(len(T))) 160T = confirm(T) 161S = confirm(S) 162#print("解候補選別T = " + str(T)) 163#print("解候補選別S = " + str(S)) 164print("解の数2 = " + str(len(T))) 165 166 167#step5 解からボリュームを計算し比較 168G1 = compare_volumes(T, W) 169#print("G1 = " + str(G1)) 170G2 = compare_volumes(S, W) 171#print("G2 = " + str(G2)) 172G3 = G1|G2 173 174print("候補解(" + str(len(G3)) + "個) = " + str(G3)) 175print("真の解 = " + str(V)) 176

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

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

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

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

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

guest

回答1

0

やりたいことの趣旨からは外れるかもしれませんが、こちらを使うとelectronのBrowserWindowを一つ立てて、Seleniumが走ります。
https://www.npmjs.com/package/puppeteer-in-electron

すでにあるelectronアプリに組み込む場合は、こちらが参考になりますが、
https://officeforest.org/wp/2020/02/26/electron%E3%81%A7puppeteer%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E3%81%97%E3%81%9F/

こちらのサイト制作者の方はNPM公式にある

js

1await pie.initialize(app); 2const browser = await pie.connect(app, puppeteer);

pie.initialize(app)を書き忘れているらしくエラーが出ます。

ご注意ください。

投稿2020/12/06 10:10

quadii.shii

総合スコア257

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問