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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

selenium

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

Q&A

解決済

1回答

884閲覧

seleniumでjavascriptを実行するもunterminated regular e xpression literal

keraker

総合スコア46

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

selenium

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

0グッド

0クリップ

投稿2022/01/21 11:33

編集2022/01/21 12:58

以下のサイトのjavascriptをdriver.execute_scriptで実行しようとしましたがこのエラーが発生しました。
https://qiita.com/kulikala/items/39536872e0f1c492b358

SyntaxError: unterminated regular expression literal (Selenium::WebDriver::Error::JavascriptError)

確認してみましたがjavascriptとしてはエラーはありませんでした。
また、alertなどは問題ありませんでした。

もとがブックマークレットなのでjavascriptを変換したときに何か失われてしまう部分でもあるのでしょうか。

よろしくお願いします。

実行した文は長いですが以下です。

ruby

1scr=<<-eos 2((document, Promise, setTimeout, html, on, size, text) => { 3 const $ = (query, doc = document) => doc.querySelector(query) 4 5 const $$ = (query, doc = document) => doc.querySelectorAll(query) 6 7 const appendChild = (child, parent = document.body) => parent.appendChild(child) 8 9 const createElement = tag => document.createElement(tag) 10 11 const cleanup = () => { 12 if (iframe !== undefined) { 13 iframe.remove() 14 } 15 } 16 17 const concat = (base, append, more = []) => base.concat(append).concat(more) 18 19 const convert = row => `"${row.map(s => replaceArr( 20 s && typeof s !== 'string' && text in s 21 ? s[text] 22 : s, 23 [/"/g, /\n/g], 24 ['""', ''] 25 )).join('","')}"` 26 27 const decode = href => { 28 let out = href 29 30 try { 31 out = decodeURI(href) 32 } catch (e) {} 33 34 return out 35 } 36 37 const download = () => { 38 const blob = new Blob([ 39 new Uint8Array([0xEF, 0xBB, 0xBF]), 40 joinLines(concat([ 41 convert([ 42 'href', 43 'decoded', 44 'title', 45 'breadcrumb', 46 'date', 47 'description' 48 ]) 49 ], ret)) 50 ], { 51 type: 'text/csv' 52 }) 53 54 const a = createElement('a') 55 const url = URL.createObjectURL(blob) 56 57 a.download = document.title + '.csv' 58 a.href = url 59 60 a.click() 61 62 setTimeout(() => URL.revokeObjectURL(url), 1000) 63 } 64 65 const filter = array => array.filter(item => !!item) 66 67 const joinLines = array => array.join('\n') 68 69 const last = (() => { 70 const g = $$('#rso .g') 71 72 if (g[size] === 0) { 73 return $('#rso') 74 } else { 75 return g[g[size] - 1].parentNode 76 } 77 })() 78 79 const main = async () => { 80 const found = scan() 81 82 if (found[size] === 0) { 83 alert('No item found.\nIf you think this script works incorrectly contact the creator.\nThx in advance.') 84 return 85 } 86 87 const message = [ 88 `Found: ${found[size]}`, 89 `Total: ${found[size] + ret[size]}` 90 ] 91 92 ret = concat(ret, found) 93 94 await scroll() 95 96 const pnnext = $('#pnnext', doc) 97 98 if (pnnext === null) { 99 alert(joinLines(message)) 100 101 cleanup() 102 103 return download() 104 } 105 106 message.unshift('Continue next page?') 107 108 if (confirm(joinLines(message))) { 109 await next(pnnext.href) 110 111 main() 112 } else { 113 cleanup() 114 download() 115 } 116 } 117 118 const mapElements = (query, callback) => Array.from($$(query, doc)).map(callback) 119 120 const next = href => { 121 if (iframe === undefined) { 122 iframe = createElement('iframe') 123 124 setStyle(iframe, { 125 display: 'none' 126 }) 127 128 appendChild(iframe) 129 } 130 131 const progress = createElement('div') 132 133 setStyle(progress, { 134 background: 'black', 135 color: 'white', 136 left: 0, 137 padding: '8px 20px', 138 position: 'fixed', 139 top: 0, 140 zIndex: 1000 141 }) 142 143 progress[text] = 'Loading...' 144 145 appendChild(progress) 146 147 return new Promise(resolve => { 148 iframe[on]('load', () => { 149 doc = iframe.contentWindow.document 150 progress.remove() 151 152 const wrapper = createElement('div') 153 wrapper[html] = $('#rso', doc)[html] 154 appendChild(wrapper, last) 155 156 if (doc !== document) { 157 $('#xjs')[html] = $('#xjs', doc)[html] 158 } 159 160 resolve() 161 }, { 162 once: true 163 }) 164 165 iframe.src = href 166 }) 167 } 168 169 const replace = (string, from, to = '') => (string || '').replace(from, to) 170 const replaceArr = (string, from, to) => from.reduce((prev, pattern, index) => replace(prev, pattern, to[index]), string) 171 172 const scan = () => filter(concat( 173 // All tab 174 mapElements('#rso div.g > div', item => { 175 const a = $('div.yuRUbf a', item) 176 if (!a || item === snippet) { 177 return false 178 } 179 180 const href = a.href 181 let date 182 let desc 183 184 if ($('#media_result_group', item)) { 185 desc = $('[role="heading"] span.hgKElc', item) 186 } else if ($('div.IsZvec g-img', item)) { 187 date = $('div.IsZvec div.fG8Fp', item).firstChild.wholeText 188 desc = $('div.IsZvec span.aCOpRe', item) 189 } else { 190 date = $('div.IsZvec span.wuQ4Ob', item) 191 desc = $('div.IsZvec div.VwiC3b', item) 192 } 193 194 return convert([ 195 href, 196 decode(href), 197 $('div.yuRUbf h3', item), 198 $('div.yuRUbf cite', item), 199 typeof date === 'string' 200 ? date 201 : date && date.children[size] === 0 ? replace(date[text], / . ?$/) : '', 202 desc 203 ? ( 204 date 205 ? replace(desc[text], date[text]).trimLeft() 206 : desc[text] 207 ) 208 : '' 209 ]) 210 }), 211 212 // News tab 213 mapElements('#rso g-card > div > div > a.WlydOe', item => { 214 const href = item.href 215 216 return convert([ 217 href, 218 decode(href), 219 $('[role=heading]', item), 220 $('div.CEMjEf span', item), 221 $('p.S1FAPd span', item), 222 $('div.GI74Re', item) 223 ]) 224 }), 225 226 // Images tab 227 mapElements('#islrg div.isv-r', item => { 228 const link = $('a[rel="noopener"]', item) 229 if (link === null) { 230 console.log(item) 231 return false 232 } 233 const href = link.href 234 const src = $('img', item).src 235 236 return convert([ 237 href, 238 decode(href), 239 link.title, 240 $('div.fxgdke', link), 241 $('span.gRqDMe', item), 242 src.startsWith('data:') ? '' : src 243 ]) 244 }) 245 )) 246 247 const scroll = () => { 248 return new Promise(resolve => { 249 ($('#islmp') || document.body).scrollIntoView({ 250 behavior: 'smooth', 251 block: 'end' 252 }) 253 254 const listener = () => { 255 clearTimeout(timer) 256 timer = setTimeout(() => { 257 document.removeEventListener('scroll', listener) 258 resolve() 259 }, 500) 260 } 261 let timer 262 263 document[on]('scroll', listener, { 264 passive: true 265 }) 266 listener() 267 }) 268 } 269 270 const setStyle = (target, style) => { 271 for (let key in style) { 272 target.style[key] = style[key] 273 } 274 } 275 276 const snippet = $('#rso div.g > div div.g > div') 277 278 let doc = document 279 let iframe 280 let ret = [] 281 282 main() 283})(document, Promise, setTimeout, 'innerHTML', 'addEventListener', 'length', 'innerText') 284eos 285 286driver.execute_script(scr)

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

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

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

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

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

otn

2022/01/21 12:09

書き方が間違っているというエラーなので、どう書いたのかを示してもらわないと、回答不能です。
guest

回答1

0

自己解決

わかりました。
使っていたエディタの検索に正規表現のチェックが入っていたため、エスケープの\が検索できていませんでした。
これをエスケープすれば解決しました。

投稿2022/01/21 13:05

keraker

総合スコア46

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問