

# 目的

<http://www.tenki.jp/forecast/3/16/4410/13208.html>  
このページの「調布市の警報・注意報」部分のheight,widthの取得

# やったこと

[code]

    from selenium import webdriver
    URL = "http://www.tenki.jp/forecast/3/16/4410/13105-daily.html"
    driver = webdriver.PhantomJS()
    driver.get(URL)
    print(driver.execute_script("return document.getElementsByClassName('class')[1].offsetWidth;"))
    
[/code]

[参考]  
<https://stackoverflow.com/questions/42610379/how-to-get-a-websites-body-
width-with-selenium-and-python>  
しかし、最終行で  
raise exception_class(message, screen, stacktrace)  
(省略)  
Screenshot: available via screen  
とでてきます。  
しかし、最終行を

[code]

    print(driver.execute_script("return document.body.offsetWidth;")    
    
[/code]

としたところ400という数字が返ってきたので、仮想ブラウザ上でも要素のheightは取得できると考えました。

driver.execute_script()は元のhtmlにjsを挿入してその結果を受け取るものだと解釈したので、DOMの書式に従って

[code]

    document.getElementsByClassName('class')[1].offsetWidth
    
[/code]

としたのですが、何がいけないのでしょうか？  
<https://developer.mozilla.org/ja/docs/Web/API/Document/getElementsByClassName>

また、  
<https://stackoverflow.com/questions/15664000/how-to-programmatically-measure-
the-elements-sizes-in-html-source-code-using-py>  
によればGhostというライブラリを用いれば可能なようなのですが、PysideやPyQtを入れたくないので、seleniumでの解決法を知りたいです。


CC BY-SA 3.0
2017-04-20T05:27:11.467
34147
2017-05-03T05:25:46.623
2017-05-23T12:38:55.307
-1
20533
question
javascript python html selenium
seleniumのPhantomJS上でHTML要素のheight,widthを取得する方法


`"Screenshot: available via screen"`
というのは、例外メッセージの末尾でおまけとして「例外オブジェクトの中に、エラーが発生したときのスクリーンショットデータも入ってるから参考にしてね！」と言われているだけで、問題の原因とは関係が無いと思います。  
実際の原因に直結するメッセージはその直前、 **(省略)** とされてしまっている部分に JSON
形式等で出力されていると思いますので、そこを改めて確認してみては如何でしょうか。

因みに、同じコードを私の手元で実行した場合、次のような JSON が返されていました。

[code]

    {'errorMessage': "'undefined' is not an object (evaluating 'document.getElementsByClassName('class')[1].offsetWidth')",
     'request': {'headers': {'Accept': 'application/json',
       'Accept-Encoding': 'identity',
       ...
    }
    
[/code]

つまり、単に `document.getElementsByClassName('class')[1]` が `undefined`
だと言われているだけのようです。

### 参考

尚、上述の「例外発生時のスクリーンショットデータ」は次のような感じで取得できますので、もしかしたら問題解決の参考になるかもしれません。

[code]

    from selenium.common.exceptions import WebDriverException
    import base64
    
    try:
        result = driver.execute_script(...)
    except WebDriverException as e:
        if e.screen:
            with open('exception.png', 'wb') as f:
                f.write(base64.b64decode(e.screen))
    
[/code]


CC BY-SA 3.0
2017-05-03T05:25:46.623
34428
2017-05-03T05:25:46.623
22931
34147
answer