2016-11-21 46 views
1

我使用Python硒与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 

但同样的错误之间增加延迟。

回答

3

getElementsByTagName()返回多个元件 - 元件的阵列(实际上是HTMLCollection) - 其不具有style属性这解释了undefined is not an object错误。

无论是指数获得一个元素:

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

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

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) 
+0

当我写这个问题时,我正在祈祷,如果你@alecxe回答我的问题......你在2分钟内完成了......感谢一百万...你为我节省了很多时间 – Umair

+0

@Umair感谢Umair提出了另一个有趣而又充分解释的问题。希望这有助于解决问题。 – alecxe

+0

是的,它解决了......我甚至认为这可能是我的JS代码中的错误... – Umair