以下のサイトのjavascriptをdriver.execute_scriptで実行しようとしましたがこのエラーが発生しました。
https://qiita.com/kulikala/items/39536872e0f1c492b358
SyntaxError: unterminated regular expression literal (Selenium::WebDriver::Error::JavascriptError)
確認してみましたがjavascriptとしてはエラーはありませんでした。
また、alertなどは問題ありませんでした。
もとがブックマークレットなのでjavascriptを変換したときに何か失われてしまう部分でもあるのでしょうか。
よろしくお願いします。
実行した文は長いですが以下です。
ruby
scr=<<-eos ((document, Promise, setTimeout, html, on, size, text) => { const $ = (query, doc = document) => doc.querySelector(query) const $$ = (query, doc = document) => doc.querySelectorAll(query) const appendChild = (child, parent = document.body) => parent.appendChild(child) const createElement = tag => document.createElement(tag) const cleanup = () => { if (iframe !== undefined) { iframe.remove() } } const concat = (base, append, more = []) => base.concat(append).concat(more) const convert = row => `"${row.map(s => replaceArr( s && typeof s !== 'string' && text in s ? s[text] : s, [/"/g, /\n/g], ['""', ''] )).join('","')}"` const decode = href => { let out = href try { out = decodeURI(href) } catch (e) {} return out } const download = () => { const blob = new Blob([ new Uint8Array([0xEF, 0xBB, 0xBF]), joinLines(concat([ convert([ 'href', 'decoded', 'title', 'breadcrumb', 'date', 'description' ]) ], ret)) ], { type: 'text/csv' }) const a = createElement('a') const url = URL.createObjectURL(blob) a.download = document.title + '.csv' a.href = url a.click() setTimeout(() => URL.revokeObjectURL(url), 1000) } const filter = array => array.filter(item => !!item) const joinLines = array => array.join('\n') const last = (() => { const g = $$('#rso .g') if (g[size] === 0) { return $('#rso') } else { return g[g[size] - 1].parentNode } })() const main = async () => { const found = scan() if (found[size] === 0) { alert('No item found.\nIf you think this script works incorrectly contact the creator.\nThx in advance.') return } const message = [ `Found: ${found[size]}`, `Total: ${found[size] + ret[size]}` ] ret = concat(ret, found) await scroll() const pnnext = $('#pnnext', doc) if (pnnext === null) { alert(joinLines(message)) cleanup() return download() } message.unshift('Continue next page?') if (confirm(joinLines(message))) { await next(pnnext.href) main() } else { cleanup() download() } } const mapElements = (query, callback) => Array.from($$(query, doc)).map(callback) const next = href => { if (iframe === undefined) { iframe = createElement('iframe') setStyle(iframe, { display: 'none' }) appendChild(iframe) } const progress = createElement('div') setStyle(progress, { background: 'black', color: 'white', left: 0, padding: '8px 20px', position: 'fixed', top: 0, zIndex: 1000 }) progress[text] = 'Loading...' appendChild(progress) return new Promise(resolve => { iframe[on]('load', () => { doc = iframe.contentWindow.document progress.remove() const wrapper = createElement('div') wrapper[html] = $('#rso', doc)[html] appendChild(wrapper, last) if (doc !== document) { $('#xjs')[html] = $('#xjs', doc)[html] } resolve() }, { once: true }) iframe.src = href }) } const replace = (string, from, to = '') => (string || '').replace(from, to) const replaceArr = (string, from, to) => from.reduce((prev, pattern, index) => replace(prev, pattern, to[index]), string) const scan = () => filter(concat( // All tab mapElements('#rso div.g > div', item => { const a = $('div.yuRUbf a', item) if (!a || item === snippet) { return false } const href = a.href let date let desc if ($('#media_result_group', item)) { desc = $('[role="heading"] span.hgKElc', item) } else if ($('div.IsZvec g-img', item)) { date = $('div.IsZvec div.fG8Fp', item).firstChild.wholeText desc = $('div.IsZvec span.aCOpRe', item) } else { date = $('div.IsZvec span.wuQ4Ob', item) desc = $('div.IsZvec div.VwiC3b', item) } return convert([ href, decode(href), $('div.yuRUbf h3', item), $('div.yuRUbf cite', item), typeof date === 'string' ? date : date && date.children[size] === 0 ? replace(date[text], / . ?$/) : '', desc ? ( date ? replace(desc[text], date[text]).trimLeft() : desc[text] ) : '' ]) }), // News tab mapElements('#rso g-card > div > div > a.WlydOe', item => { const href = item.href return convert([ href, decode(href), $('[role=heading]', item), $('div.CEMjEf span', item), $('p.S1FAPd span', item), $('div.GI74Re', item) ]) }), // Images tab mapElements('#islrg div.isv-r', item => { const link = $('a[rel="noopener"]', item) if (link === null) { console.log(item) return false } const href = link.href const src = $('img', item).src return convert([ href, decode(href), link.title, $('div.fxgdke', link), $('span.gRqDMe', item), src.startsWith('data:') ? '' : src ]) }) )) const scroll = () => { return new Promise(resolve => { ($('#islmp') || document.body).scrollIntoView({ behavior: 'smooth', block: 'end' }) const listener = () => { clearTimeout(timer) timer = setTimeout(() => { document.removeEventListener('scroll', listener) resolve() }, 500) } let timer document[on]('scroll', listener, { passive: true }) listener() }) } const setStyle = (target, style) => { for (let key in style) { target.style[key] = style[key] } } const snippet = $('#rso div.g > div div.g > div') let doc = document let iframe let ret = [] main() })(document, Promise, setTimeout, 'innerHTML', 'addEventListener', 'length', 'innerText') eos driver.execute_script(scr)
まだ回答がついていません
会員登録して回答してみよう