代码之家  ›  专栏  ›  技术社区  ›  Umair Ayub

如果我使用execute_script()函数-Selenium,则无法使用Selenium截图

  •  1
  • Umair Ayub  · 技术社区  · 9 年前

    我正在使用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 然后成功保存屏幕截图。

    我试图在 执行脚本 然后截图,比如

    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
    

    但同样的错误。

    1 回复  |  直到 9 年前
        1
  •  3
  •   alecxe    9 年前

    getElementsByTagName() 返回 多元素 -元素数组(实际上是 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)