如果我使用execute_script()函数Selenium,则无法使用Selenium拍摄屏幕截图

2024-04-25 04:38:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python Selenium和PhantomJS

我的目标是突出显示网页上所有表格的边框,然后截图。这就是我要做的

    dcap = dict(DesiredCapabilities.PHANTOMJS)
    dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safari/537.36")

    self.driver = webdriver.PhantomJS(desired_capabilities=dcap,   service_args=['--ignore-ssl-errors=true', '--ssl-protocol=any', '--web-security=false'])
    self.driver.set_window_size(1024, 768)
    self.driver.get(response.url)
    self.driver.execute_script("document.getElementsByTagName('form').style['border'] = 'solid'; document.getElementsByTagName('form').style['border-color'] = 'red'")

    self.driver.save_screenshot('test.png') # save a screenshot to disk

我要走了

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/Scrapy-1.2.1-py2.7.egg/scrapy/utils/defer.py", line 102, in iter_errback
    yield next(it)
  File "/usr/local/lib/python2.7/dist-packages/Scrapy-1.2.1-py2.7.egg/scrapy/spidermiddlewares/offsite.py", line 29, in process_spider_output
    for x in result:
  File "/usr/local/lib/python2.7/dist-packages/Scrapy-1.2.1-py2.7.egg/scrapy/spidermiddlewares/referer.py", line 22, in <genexpr>
    return (_set_referer(r) for r in result or ())
  File "/usr/local/lib/python2.7/dist-packages/Scrapy-1.2.1-py2.7.egg/scrapy/spidermiddlewares/urllength.py", line 37, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "/usr/local/lib/python2.7/dist-packages/Scrapy-1.2.1-py2.7.egg/scrapy/spidermiddlewares/depth.py", line 58, in <genexpr>
    return (r for r in result or () if _filter(r))
  File "/home/mani/legibot/scrapy_app/spiders/spider.py", line 63, in parse_page
    self.driver.execute_script("document.getElementsByTagName('form').style['border'] = 'solid'; document.getElementsByTagName('form').style['border-color'] = 'red'")
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 465, in execute_script
    'args': converted_args})['value']
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 236, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 192, in check_response
    raise exception_class(message, screen, stacktrace)
WebDriverException: Message: {"errorMessage":"undefined is not an object (evaluating 'document.getElementsByTagName('form').style['border'] = 'solid'')","request":{"headers":{"Accept":"application/json","Accept-Encoding":"identity","Connection":"close","Content-Length":"211","Content-Type":"application/json;charset=UTF-8","Host":"127.0.0.1:55507","User-Agent":"Python-urllib/2.7"},"httpVersion":"1.1","method":"POST","post":"{\"sessionId\": \"b09db570-b01b-11e6-b238-a5d1487ff8e7\", \"args\": [], \"script\": \"document.getElementsByTagName('form').style['border'] = 'solid'; document.getElementsByTagName('form').style['border-color'] = 'red'\"}","url":"/execute","urlParsed":{"anchor":"","query":"","file":"execute","directory":"/","path":"/execute","relative":"/execute","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/execute","queryKey":{},"chunks":["execute"]},"urlOriginal":"/session/b09db570-b01b-11e6-b238-a5d1487ff8e7/execute"}}
Screenshot: available via screen

如果我注释掉execute_script函数,那么屏幕截图就会成功保存。你知道吗

我试着在execute_script和截图之间增加延迟

self.driver.execute_script("document.getElementsByTagName('form').style['border'] = 'solid'; document.getElementsByTagName('form').style['border-color'] = 'red'")
time.sleep(2)
self.driver.save_screenshot('test.png') # save a screenshot to disk

但同样的错误。你知道吗


Tags: inpyselfformexecutestylelibusr
1条回答
网友
1楼 · 发布于 2024-04-25 04:38:30

^{}返回多个元素-一个元素数组(实际上是HTMLCollection)-它没有解释style错误的undefined is not an object属性。你知道吗

按索引获取一个元素:

document.getElementsByTagName('form')[0].style['border'] = 'solid';  // ...

或者,通过selenium定位元素,然后将其作为参数传递到脚本中:

form = self.driver.find_element_by_tag_name("form")
self.driver.execute_script("arguments[0].style['border'] = 'solid'; arguments[0].style['border-color'] = 'red';", form)

而且,它还可以扩展到多种形式:

forms = self.driver.find_elements_by_tag_name("form")
for form in forms:
    self.driver.execute_script("""
        var form = arguments[0];
        form.style['border'] = 'solid'; 
        form.style['border-color'] = 'red';
    """, form)

相关问题 更多 >