2019年7月8日月曜日

PythonでSeleniumのclickメソッドは効かない

PythonでSeleniumのclickメソッドがどうしても効かない問題に遭遇しました。

最初に使ったソースコードは以下の通りです。

from selenium import webdriver
driver = webdriver.Firefox()
driver.get('https://xxxxx/')  # 自分の検証サイトのURL
submit = driver.find_element_by_id("submitbutton")
submit.click()


調べたところ、要素はブラウザー上にクリックできない場所に存在している可能性があります。

でしたら、ブラウザーを最下部に移動してみようと考えました。

以下のコードを使って、最下部にスクロールしました。

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

再度検証したところだめでした。


再度調査したら、Seleniumが介在せずそのまま実行するならうまくいくかもしれませんの情報がありました。

Seleniumで直接javascriptを実行し、ボタンをクリックします。

driver.execute_script("document.getElementById('submitbutton').click();")

検証したところ、だめでした。

「ENTER」キーならうまくいった情報もありましたので、

「ENTER」キーを使ってクリックします。

submit.send_keys(Keys.ENTER)

結果としてだめでした。

気分を取り直して、要素に焦点を当たってからクリックするのも検証しました。

要素に焦点を当たります

ActionChains(driver).move_to_element(submit).perform()

それでもだめでした。

最後に辿り着いたのは「submit」メソッドでした。

driver.submit()

やっとうまくいきました。

フォームの中のボタン、クリックメソッドを使うより、サブミットの方がいいらいいです。

2019年6月27日木曜日

Golangのtry-catch的なやり方

以下のphpのtry-catchの書き方、ウェブエンジニアなら、恐らく何度でも目にしたことがあると思います。
<?php
function hoge() {
    try {
        throw new Exception("throw error\n");
    }catch(Exception $e) {
        echo $e->getMessage();
        echo "will do something to rollback";
    }
}
hoge();
?>
Golangなら、相等な書き方はないでしょうか?
答えは、あります。サンプルは下記の通りです。
package main
import (
    "fmt"
)
func hoge() {
    defer func() {
            if err := recover(); err != nil {
                    fmt.Println("catch the error.", err)
                    fmt.Println("will do something to rollback")
            }
        }()
        panic("throw exception")   
}
func main() {
    hoge()
}
簡単に説明します。
異常が発生しそうなソースコードの前に、「recover」を使って、異常を捕捉(catch)することができます。
特にDBの何かエラーが発生しそうで、rollbackをしないといけないときに、とておも役に立つと思います。
使い方は以下のように↓
func 関数名() {
    defer func() {
        if err := recover(); err != nil {
            // rollbackはここに書く
        }
    }
    // db実行などエラーが発生しそうなコードはここに書く
}