[PHP] WindowsでCodeceptionを使うと、ChromeDriverが動かない!?

なんとか動くようになったけど、久々にめっちゃハマった(´;ω;`)

 

最近のChromeって、コード経由でコントロールするときにSeleniumを挟まずにChromeDriver単体で触ることができるんですね。知らずに生きてましたわ;;

というわけで、CodeceptionでChromeDriver経由でChromeを触ってみました。

(ちなみに、使用しているOSはWindow 10 Home 64bitで、Git Bash(64bit)をインストールして、これをシェルとして使っています。)

この辺のChromeDriverを使うまでの手順は公式ページのWebDriverのページに書いてあるものをそのまま実行しています。

To run tests in Chrome browser you may connect to ChromeDriver directly, without using Selenium Server.

1. Install ChromeDriver.
2. Launch ChromeDriver: chromedriver --url-base=/wd/hub
3. Configure this module to use ChromeDriver port:

引用元: WebDriver – Codeception – Documentation (http://codeception.com/docs/modules/WebDriver#ChromeDriver)

 

この通りにやってみて、シェルで「./vendor/bin/codecept run」と走らせてみたのですが、エラーが発生します。

「レスポンスがJSONデコードできないよ!」って言うエラーですけど、問題はそこではなくて、ChromeDriverからのレスポンスが「unhandled request」ってなってるところ。
一応Chromedriverをブラウザ経由で(http://localhost:9515)見てみましたが、同じレスポンスが帰ってきます。これじゃあさっぱり前に進みませんねぇ。

なぜなのかわからず、ChromeDriver周りのエラーをググっていったら、こんな記事を発見。

Issue with using selenium and webdriver doc · Issue #2968 · electron/electron · GitHub
https://github.com/electron/electron/issues/2968

Windowsでは動かないと、似たような問題を訴えてらっしゃいます。
そしてこの人がやってみたことは、–url-baseのパスを「wd/hub」にすること。

改めてコマンドを叩いたら、バッチリ動きました。

おうふ、マジかよ……(‘A`)

多分Linuxでは問題なく動くんだろうなぁ。
Windowsなんぞで動かすやつなんぞしらん!ってことなのでしょか?つらみ(´;ω;`)

[Codeception] amOnPageメソッドの挙動の食い違いに泣かされる

振る舞いテスト(Acceptance Testing)の動作検証中にめっちゃくちゃハマってしまったのでメモっておきますorz

 

複数サイトにまたがってアクセスするので、受け入れテストスイートの設定ファイル(acceptance.suite.yml)内のurl欄を空欄にしたうえで、以下のようなテストコードを書きました。

このコードを、PhpBrowser上で動かすと普通に動くのですが、Firefox上で動かすとエラーが出てしまいます。

一見どういう意味なのか分からないのですが、「codecept run –debug」コマンドで動作の内容を見ながら確認すると、GET周りで変な挙動が……

なぜかURLの頭に「/」がついてる!

まぁamOnPage()は相対URL用のメソッドだから、スラッシュが頭についちゃうんでしょうかね。
amOnUrl()を使ってみたら問題なく動きました。

でもPhpBrowserでは普通に動いてしまうのは紛らわしい……(´・ω・`)

[laravel] 既存のユーザー情報を「認証済み」にしてテストケースを進めたい

Webアプリケーションを作ってると、目的の画面へ行ってアサートを走らせる前に、必ずユーザー認証を済ませて置かねばならないケースが多々あります。というかそんなパターンが大多数なんじゃないかと思わなくもない……

Laravelさんはそのへんもぬかりなく、actingAs()メソッドで簡単に実現してくれます。

以下リファレンスから引用。

でも、リファレンスの例文通りに動かすと、認証用にユーザーを作り、DBに書き込んでから動かしているみたいで、なんというかめんどくさいです(´・ω・`)

俺の場合はSeederで予めユーザーデータを定義してあるので、できればそっちを使ってテストしたいんですよね……。
そういう時は↓のように書くといけるみたいです。

Eloquentのfindメソッドで取ってくるだけ。actingAsメソッドの引数は、Authenticatableインターフェースが実装されていればなんでもいいので、こんな書き方でいけるみたいです。

ちょーかんたん。

Goutteのリクエストタイムアウト秒数を設定する

やたら重たい処理をさせたいけど、先にGoutteがへばってしまうと困るのでタイムアウト秒数を変えたい時、以下のように書いたら行けるみたいですね(´・ω・`)

もしくは以下の書き方。

参考 cURL timing out even after setting timeout value · Issue #197 · FriendsOfPHP/Goutte · GitHub

[PHP] 動的に生成したファイルを任意の名前で保存させたい。

PHPの処理結果を普通のHTML形式ではなく、JPEGやらCSVと言った形式で組み立ててダウンロードさせるようにした場合、ファイル名がスクリプトの名前そのまんまになってしまったり、名前がつかずに保存されるのが困りモノ……(´・ω・`)

でも、「Content-Disposition」ヘッダーフィールドを設定すると、保存名をこちらの好きなものに変えられるみたい。

PHPで書くならこんな感じ。↓

ちなみにこのディレクティブでは、ファイルをダウンロードさせるか(attachment)、そのまま画面に表示するか(inline)ということも設定できます。

「今まで使ってなかったのかよー」というツッコミはご勘弁ください……orz