Gauge + Selenium + Python の環境構築

概要

Gaugeの環境構築を行ったので備忘録。

gauge.org

目標はGoogleを開いてキーワード検索までやってみる。

環境

インストール手順

Gaugeのインストール

docs.gauge.org

上記のGaugeのGet startedのInstalling GaugeでMacOSVS CodeにGaugeのプラグインをインストールする。

Python のパッケージとしてのGauge

上記の手順には記載されていないがGaugeのインストールした環境にあるrequirements.txt

pip install -r requirements.txt 

でパッケージをインストール。
ただし、requirements.txtの中身にはgetgaugeのみなので、

pip install getgauge

でもいい。

Seleniumのインストール

www.selenium.dev

上記の手順に則ってpip install seleniumseleniumパッケージをインストール。

chromedriver-binaryのインストール

seleniumのインストールが完了した後、ChromeでブラウザテストするためにPythonのパッケージchromedriver-binaryをインストール。
chromedriver-binaryのバージョンはインストールされているChromeのバージョンに対応しているので、
[設定] → [Chromeについて]
でバージョンを確認。 図の通り、バージョンは 107.0.5304.110 なのでメジャーバージョンが107.xx.xx.xx のchromedriver-binaryをインストール。

pip install chromedriver-binary==107.0.5304.62.0

動作確認

step_impl

step_implフォルダの直下のstep_impl.pyを開いて下記のコードを追記する。

パッケージ

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver import ChromeOptions

ChromeOptions

options = ChromeOptions()
options.add_argument("--incognito")
driver = webdriver.Chrome(options=options)

関数

@step("グーグルのサイトを開く")
def open_google() -> None:
    driver.get('https://google.co.jp/')

@step("検索欄に<word>を入力")
def words_input(key_word: str) -> None:
    driver.find_element(By.NAME, "q").send_keys(key_word)

@step("Enterキーを入力")
def Enter_key_input() -> None:
    driver.find_element(By.NAME, "q").send_keys(Keys.ENTER)

specファイル

specsフォルダの直下にgoogle.specのファイルを作成して下記の内容で保存する。

# Google検索
Google で特定のワードの検索を行い結果を確認する
 
## 検索成功
Tags: successful

*グーグルのサイトを開く
*検索欄に"test"を入力
*Enterキーを入力

後はRun Specで実行して結果を確認する。

TypeError: Descriptors cannot not be created directly が出た

概要

Gaugeチュートリアルを進めていくと下記のようなエラーが出た。

TypeError: Descriptors cannot not be created directly.
If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
If you cannot immediately regenerate your protos, some other possible workarounds are:
1. Downgrade the protobuf package to 3.20.x or lower.
2. Set PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python (but this will use pure-Python parsing and will be much slower).
More information: https://developers.google.com/protocol-buffers/docs/news/2022-05-06#python-updates
Error occurred while waiting for runner process to finish.

環境

解決策

エラーが出ている通りに

pip install protobuf==3.19.0

protobufのパッケージをインストールすれば解決した。

参考

stackoverflow.com

「cannot load such file -- sassc」が出た

概要

Ruby on Rails 6 超入門のchapter 2を進めていると下記のエラーが出力。

環境

解決策

sassc-railsがインストールされていないことが原因らしくGemfileにある

# Use Sass to process CSS
# gem "sassc-rails"

gem "sassc-rails"コメントを外す。

# Use Sass to process CSS
gem "sassc-rails"

その後、bundle installを実行するとエラーが解決した。

余談

Gemfileとは

bundler.io

公式によるとgem installコマンドでインストールしたパッケージ情報などがここに記述される。

bundle installとは

bundler.io

こちらも公式によるとGemfileに書かれている内容をインストールするためのコマンド。

参考

qiita.com

WinMergeをコマンドラインから実行してレポートに残す方法

概要

Windowsのツールの1つWinMergeをコマンドで実行して差分の結果をレポートとして出力する方法。

実行方法

公式のページで確認すると

manual.winmerge.org

WinMergeU.exe leftpath rightpath

で比較ができる。
また、比較した結果をレポートとして残したい場合は

WinMergeU.exe leftpath rightpath /or reportpath

で残すことができる。

参考

qiita.com

PuTTYで踏み台サーバを経由して接続する方法

概要

PuTTYから踏み台サーバを経由してローカルフォワード、ダイナミックフォワードの設定をコマンドで接続したので備忘録。

事前知識

踏み台サーバ

目的のサーバへ接続するために一度経由するサーバ。

ローカルフォワード

接続先のサーバのIPアドレスとポート番号を指定してどのポート番号で接続するようにすること。
コマンド

putty.exe 踏み台サーバのIPアドレス -L 源ポート:接続先のIPアドレス:接続先のポート番号

ダイナミックフォワード

接続先のサーバの全ての接続先をSOCKSプロキシとして接続できるようにすること。
コマンド

putty.exe 踏み台サーバのIPアドレス -D 接続先のIPアドレス:源ポート

参考

www2.filewo.net

外積の性質について【AtCoder】

概要

atcoder.jp

上記の問題に対する解説の中で外積の性質について記述されていたので、もう少し調べてみた。

atcoder.jp

外積の公式

 \vec{a} \times \vec{b} = |\vec{a}||\vec{b}|\sin(\theta)

 \vec{a} \times \vec{b} について

 a = (a_1, a_2, a_3), b=(b_1, b_2, b_3) のとき  \vec{a} \times \vec{b} = (a_2 \times b_3 - a_3 \times b_2, a_3 \times b_1 - a_1 \times b_3, a_1 \times b_2 - a_2 \times b_1)
で表される。
ここで、概要で紹介されている問題に当てはめると、
 a = (a_1, a_2, 0), b=(b_1, b_2, 0)になるので、
 \vec{a} \times \vec{b} = a_1 \times b_2 - a_2 \times b_1 の式になる。

解説の意味

 a_1 \times b_2 - a_2 \times b_1 > 0 になるときは
0 \lt \sin(\theta) \leqq 1 のときになるので、 0^{\circ} \lt \theta \leqq 180^{\circ}
 a_1 \times b_2 - a_2 \times b_1 \leqq 0 になるときは
 -1 \leqq \sin(\theta) \leqq 0のときになるので、 180^{\circ} \leqq \theta \leqq 360^{\circ}
問題の場合、 \angle ABC 180^{\circ} より大きいか小さいか判断する必要になるので、
上記により a_1 \times b_2 - a_2 \times b_1が0より大きいか小さいか確認する必要があるということ。

warning: control reaches end of non-void function [-Wreturn-type] が出た【C++】

概要

atcoder.jp

上記の問題を解くためにc++再帰関数を書いたところ

warning: control reaches end of non-void function [-Wreturn-type]

が出た。

問題のコード

int anc(int cnt, int n){
    if(n == 1) return cnt+1;
    anc(cnt+1, a[n-1]);
}

int main() {
    int n;
    cin >> n;
    for(int i=1; i<n; i++) cin >> a[i];
    cout << anc(0, a[n-1]) << endl;
}

解決方法

タイトルのwarningの内容について調べてみると再帰関数の最後にreturnがないためにwarning が出る。
warningが出力されないように問題のコードを修正すると

int anc(int cnt, int n){
    if(n == 1) return cnt+1;
    return anc(cnt+1, a[n-1]);  // 修正箇所
}

int main() {
    int n;
    cin >> n;
    for(int i=1; i<n; i++) cin >> a[i];
    cout << anc(0, a[n-1]) << endl;
}

になる。