snipt

Ctrl+h for KB shortcuts

Python

Python Selenium workaround for full page screenshot using chromedriver 2.x

@staticmethod
    def chrome_take_full_page_screenshot(file):
        Global.browser.maximize_window()
        Global.scroll_to_zero()
        time.sleep(0.2)

        Log.Debug("Starting chrome full page screenshot workaround ...")

        total_width = Global.browser.execute_script("return document.body.offsetWidth")
        total_height = Global.browser.execute_script("return document.body.parentNode.scrollHeight")

        viewport_width = Global.browser.execute_script("return document.body.clientWidth")
        viewport_height = Global.browser.execute_script("return window.innerHeight")

        Log.Debug("Total: ({0}, {1}), Viewport: ({2},{3})".format(total_width, total_height,viewport_width,viewport_height))

        rectangles = []

        i = 0
        while i < total_height:
            ii = 0
            top_height = i + viewport_height

            if top_height > total_height:
                top_height = total_height

            while ii < total_width:
                top_width = ii + viewport_width

                if top_width > total_width:
                    top_width = total_width

                Log.Debug("Appending rectangle ({0},{1},{2},{3})".format(ii,i,top_width,top_height))
                rectangles.append((ii,i,top_width,top_height))

                ii = ii + viewport_width

            i = i + viewport_height


        stitched_image = Image.new('RGB', (total_width, total_height))
        previous = None
        part = 0
        for rectangle in rectangles:
            if not previous is None:
                Global.browser.execute_script("window.scrollTo({0}, {1})".format(rectangle[0], rectangle[1]))
                Log.Debug("Scrolled To ({0},{1})".format(rectangle[0], rectangle[1]))
                time.sleep(0.2)

            file_name = "{0}scroll_{1}_part_{2}.png".format(Config.tmp_path, Global.cache_id, part)
            Log.Debug("Capturing {0} ...".format(file_name))

            Global.browser.get_screenshot_as_file(file_name)

            screenshot = Image.open(file_name)

            offset = (rectangle[0], rectangle[1])

            Log.Debug("Adding to stitched image with offset ({0}, {1})".format(offset[0],offset[1]))
            stitched_image.paste(screenshot, offset)

            del screenshot

            os.remove(file_name)

            part = part + 1
            previous = rectangle

        stitched_image.save(file)

        Log.Debug("Finishing chrome full page screenshot workaround ...")

        return True

Description

Workaround to take full page screenshots using python, selenium and chromedriver 2.x. Some variables are custom variables, please replace them.
https://snipt.net/embed/125df80fcdddf2602cea5efefd9b116d/
/raw/125df80fcdddf2602cea5efefd9b116d/
125df80fcdddf2602cea5efefd9b116d
python
Python
73
2019-07-16T09:01:45
True
False
False
/api/public/snipt/116015/
python-selenium-workaround-for-full-page-screenshot-using-chromedriver-2x
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><a href="#L-1"> 1</a> <a href="#L-2"> 2</a> <a href="#L-3"> 3</a> <a href="#L-4"> 4</a> <a href="#L-5"> 5</a> <a href="#L-6"> 6</a> <a href="#L-7"> 7</a> <a href="#L-8"> 8</a> <a href="#L-9"> 9</a> <a href="#L-10">10</a> <a href="#L-11">11</a> <a href="#L-12">12</a> <a href="#L-13">13</a> <a href="#L-14">14</a> <a href="#L-15">15</a> <a href="#L-16">16</a> <a href="#L-17">17</a> <a href="#L-18">18</a> <a href="#L-19">19</a> <a href="#L-20">20</a> <a href="#L-21">21</a> <a href="#L-22">22</a> <a href="#L-23">23</a> <a href="#L-24">24</a> <a href="#L-25">25</a> <a href="#L-26">26</a> <a href="#L-27">27</a> <a href="#L-28">28</a> <a href="#L-29">29</a> <a href="#L-30">30</a> <a href="#L-31">31</a> <a href="#L-32">32</a> <a href="#L-33">33</a> <a href="#L-34">34</a> <a href="#L-35">35</a> <a href="#L-36">36</a> <a href="#L-37">37</a> <a href="#L-38">38</a> <a href="#L-39">39</a> <a href="#L-40">40</a> <a href="#L-41">41</a> <a href="#L-42">42</a> <a href="#L-43">43</a> <a href="#L-44">44</a> <a href="#L-45">45</a> <a href="#L-46">46</a> <a href="#L-47">47</a> <a href="#L-48">48</a> <a href="#L-49">49</a> <a href="#L-50">50</a> <a href="#L-51">51</a> <a href="#L-52">52</a> <a href="#L-53">53</a> <a href="#L-54">54</a> <a href="#L-55">55</a> <a href="#L-56">56</a> <a href="#L-57">57</a> <a href="#L-58">58</a> <a href="#L-59">59</a> <a href="#L-60">60</a> <a href="#L-61">61</a> <a href="#L-62">62</a> <a href="#L-63">63</a> <a href="#L-64">64</a> <a href="#L-65">65</a> <a href="#L-66">66</a> <a href="#L-67">67</a> <a href="#L-68">68</a> <a href="#L-69">69</a> <a href="#L-70">70</a> <a href="#L-71">71</a> <a href="#L-72">72</a> <a href="#L-73">73</a></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span id="L-1"><a name="L-1"></a><span class="nd">@staticmethod</span> </span><span id="L-2"><a name="L-2"></a> <span class="k">def</span> <span class="nf">chrome_take_full_page_screenshot</span><span class="p">(</span><span class="nb">file</span><span class="p">):</span> </span><span id="L-3"><a name="L-3"></a> <span class="n">Global</span><span class="o">.</span><span class="n">browser</span><span class="o">.</span><span class="n">maximize_window</span><span class="p">()</span> </span><span id="L-4"><a name="L-4"></a> <span class="n">Global</span><span class="o">.</span><span class="n">scroll_to_zero</span><span class="p">()</span> </span><span id="L-5"><a name="L-5"></a> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.2</span><span class="p">)</span> </span><span id="L-6"><a name="L-6"></a> </span><span id="L-7"><a name="L-7"></a> <span class="n">Log</span><span class="o">.</span><span class="n">Debug</span><span class="p">(</span><span class="s2">&quot;Starting chrome full page screenshot workaround ...&quot;</span><span class="p">)</span> </span><span id="L-8"><a name="L-8"></a> </span><span id="L-9"><a name="L-9"></a> <span class="n">total_width</span> <span class="o">=</span> <span class="n">Global</span><span class="o">.</span><span class="n">browser</span><span class="o">.</span><span class="n">execute_script</span><span class="p">(</span><span class="s2">&quot;return document.body.offsetWidth&quot;</span><span class="p">)</span> </span><span id="L-10"><a name="L-10"></a> <span class="n">total_height</span> <span class="o">=</span> <span class="n">Global</span><span class="o">.</span><span class="n">browser</span><span class="o">.</span><span class="n">execute_script</span><span class="p">(</span><span class="s2">&quot;return document.body.parentNode.scrollHeight&quot;</span><span class="p">)</span> </span><span id="L-11"><a name="L-11"></a> </span><span id="L-12"><a name="L-12"></a> <span class="n">viewport_width</span> <span class="o">=</span> <span class="n">Global</span><span class="o">.</span><span class="n">browser</span><span class="o">.</span><span class="n">execute_script</span><span class="p">(</span><span class="s2">&quot;return document.body.clientWidth&quot;</span><span class="p">)</span> </span><span id="L-13"><a name="L-13"></a> <span class="n">viewport_height</span> <span class="o">=</span> <span class="n">Global</span><span class="o">.</span><span class="n">browser</span><span class="o">.</span><span class="n">execute_script</span><span class="p">(</span><span class="s2">&quot;return window.innerHeight&quot;</span><span class="p">)</span> </span><span id="L-14"><a name="L-14"></a> </span><span id="L-15"><a name="L-15"></a> <span class="n">Log</span><span class="o">.</span><span class="n">Debug</span><span class="p">(</span><span class="s2">&quot;Total: ({0}, {1}), Viewport: ({2},{3})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">total_width</span><span class="p">,</span> <span class="n">total_height</span><span class="p">,</span><span class="n">viewport_width</span><span class="p">,</span><span class="n">viewport_height</span><span class="p">))</span> </span><span id="L-16"><a name="L-16"></a> </span><span id="L-17"><a name="L-17"></a> <span class="n">rectangles</span> <span class="o">=</span> <span class="p">[]</span> </span><span id="L-18"><a name="L-18"></a> </span><span id="L-19"><a name="L-19"></a> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-20"><a name="L-20"></a> <span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">total_height</span><span class="p">:</span> </span><span id="L-21"><a name="L-21"></a> <span class="n">ii</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-22"><a name="L-22"></a> <span class="n">top_height</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">viewport_height</span> </span><span id="L-23"><a name="L-23"></a> </span><span id="L-24"><a name="L-24"></a> <span class="k">if</span> <span class="n">top_height</span> <span class="o">&gt;</span> <span class="n">total_height</span><span class="p">:</span> </span><span id="L-25"><a name="L-25"></a> <span class="n">top_height</span> <span class="o">=</span> <span class="n">total_height</span> </span><span id="L-26"><a name="L-26"></a> </span><span id="L-27"><a name="L-27"></a> <span class="k">while</span> <span class="n">ii</span> <span class="o">&lt;</span> <span class="n">total_width</span><span class="p">:</span> </span><span id="L-28"><a name="L-28"></a> <span class="n">top_width</span> <span class="o">=</span> <span class="n">ii</span> <span class="o">+</span> <span class="n">viewport_width</span> </span><span id="L-29"><a name="L-29"></a> </span><span id="L-30"><a name="L-30"></a> <span class="k">if</span> <span class="n">top_width</span> <span class="o">&gt;</span> <span class="n">total_width</span><span class="p">:</span> </span><span id="L-31"><a name="L-31"></a> <span class="n">top_width</span> <span class="o">=</span> <span class="n">total_width</span> </span><span id="L-32"><a name="L-32"></a> </span><span id="L-33"><a name="L-33"></a> <span class="n">Log</span><span class="o">.</span><span class="n">Debug</span><span class="p">(</span><span class="s2">&quot;Appending rectangle ({0},{1},{2},{3})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ii</span><span class="p">,</span><span class="n">i</span><span class="p">,</span><span class="n">top_width</span><span class="p">,</span><span class="n">top_height</span><span class="p">))</span> </span><span id="L-34"><a name="L-34"></a> <span class="n">rectangles</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">ii</span><span class="p">,</span><span class="n">i</span><span class="p">,</span><span class="n">top_width</span><span class="p">,</span><span class="n">top_height</span><span class="p">))</span> </span><span id="L-35"><a name="L-35"></a> </span><span id="L-36"><a name="L-36"></a> <span class="n">ii</span> <span class="o">=</span> <span class="n">ii</span> <span class="o">+</span> <span class="n">viewport_width</span> </span><span id="L-37"><a name="L-37"></a> </span><span id="L-38"><a name="L-38"></a> <span class="n">i</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">viewport_height</span> </span><span id="L-39"><a name="L-39"></a> </span><span id="L-40"><a name="L-40"></a> </span><span id="L-41"><a name="L-41"></a> <span class="n">stitched_image</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">&#39;RGB&#39;</span><span class="p">,</span> <span class="p">(</span><span class="n">total_width</span><span class="p">,</span> <span class="n">total_height</span><span class="p">))</span> </span><span id="L-42"><a name="L-42"></a> <span class="n">previous</span> <span class="o">=</span> <span class="bp">None</span> </span><span id="L-43"><a name="L-43"></a> <span class="n">part</span> <span class="o">=</span> <span class="mi">0</span> </span><span id="L-44"><a name="L-44"></a> <span class="k">for</span> <span class="n">rectangle</span> <span class="ow">in</span> <span class="n">rectangles</span><span class="p">:</span> </span><span id="L-45"><a name="L-45"></a> <span class="k">if</span> <span class="ow">not</span> <span class="n">previous</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> </span><span id="L-46"><a name="L-46"></a> <span class="n">Global</span><span class="o">.</span><span class="n">browser</span><span class="o">.</span><span class="n">execute_script</span><span class="p">(</span><span class="s2">&quot;window.scrollTo({0}, {1})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">rectangle</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">rectangle</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> </span><span id="L-47"><a name="L-47"></a> <span class="n">Log</span><span class="o">.</span><span class="n">Debug</span><span class="p">(</span><span class="s2">&quot;Scrolled To ({0},{1})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">rectangle</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">rectangle</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> </span><span id="L-48"><a name="L-48"></a> <span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.2</span><span class="p">)</span> </span><span id="L-49"><a name="L-49"></a> </span><span id="L-50"><a name="L-50"></a> <span class="n">file_name</span> <span class="o">=</span> <span class="s2">&quot;{0}scroll_{1}_part_{2}.png&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">Config</span><span class="o">.</span><span class="n">tmp_path</span><span class="p">,</span> <span class="n">Global</span><span class="o">.</span><span class="n">cache_id</span><span class="p">,</span> <span class="n">part</span><span class="p">)</span> </span><span id="L-51"><a name="L-51"></a> <span class="n">Log</span><span class="o">.</span><span class="n">Debug</span><span class="p">(</span><span class="s2">&quot;Capturing {0} ...&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">file_name</span><span class="p">))</span> </span><span id="L-52"><a name="L-52"></a> </span><span id="L-53"><a name="L-53"></a> <span class="n">Global</span><span class="o">.</span><span class="n">browser</span><span class="o">.</span><span class="n">get_screenshot_as_file</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span> </span><span id="L-54"><a name="L-54"></a> </span><span id="L-55"><a name="L-55"></a> <span class="n">screenshot</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span> </span><span id="L-56"><a name="L-56"></a> </span><span id="L-57"><a name="L-57"></a> <span class="n">offset</span> <span class="o">=</span> <span class="p">(</span><span class="n">rectangle</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">rectangle</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> </span><span id="L-58"><a name="L-58"></a> </span><span id="L-59"><a name="L-59"></a> <span class="n">Log</span><span class="o">.</span><span class="n">Debug</span><span class="p">(</span><span class="s2">&quot;Adding to stitched image with offset ({0}, {1})&quot;</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">offset</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">offset</span><span class="p">[</span><span class="mi">1</span><span class="p">]))</span> </span><span id="L-60"><a name="L-60"></a> <span class="n">stitched_image</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">screenshot</span><span class="p">,</span> <span class="n">offset</span><span class="p">)</span> </span><span id="L-61"><a name="L-61"></a> </span><span id="L-62"><a name="L-62"></a> <span class="k">del</span> <span class="n">screenshot</span> </span><span id="L-63"><a name="L-63"></a> </span><span id="L-64"><a name="L-64"></a> <span class="n">os</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">file_name</span><span class="p">)</span> </span><span id="L-65"><a name="L-65"></a> </span><span id="L-66"><a name="L-66"></a> <span class="n">part</span> <span class="o">=</span> <span class="n">part</span> <span class="o">+</span> <span class="mi">1</span> </span><span id="L-67"><a name="L-67"></a> <span class="n">previous</span> <span class="o">=</span> <span class="n">rectangle</span> </span><span id="L-68"><a name="L-68"></a> </span><span id="L-69"><a name="L-69"></a> <span class="n">stitched_image</span><span class="o">.</span><span class="n">save</span><span class="p">(</span><span class="nb">file</span><span class="p">)</span> </span><span id="L-70"><a name="L-70"></a> </span><span id="L-71"><a name="L-71"></a> <span class="n">Log</span><span class="o">.</span><span class="n">Debug</span><span class="p">(</span><span class="s2">&quot;Finishing chrome full page screenshot workaround ...&quot;</span><span class="p">)</span> </span><span id="L-72"><a name="L-72"></a> </span><span id="L-73"><a name="L-73"></a> <span class="k">return</span> <span class="bp">True</span> </span></pre></div> </td></tr></table>
"chromedriver 2.x", full, page, python, screenshot, selenium