LoginSignup
0
1

More than 3 years have passed since last update.

PHPがメインの経験者が、Pythonを始めて5日目の話(selenium)PHP vs Python

Last updated at Posted at 2019-11-24

はじめに

今回はseleniumを使用してChromeブラウザをコントロールしてWEBのサービスに保存されているファイルをダウンロードするのが目的です。もう一点の重要な目的はPHPとPythonで同じダウンロードを行い、結果の比較をしたいと思います。ダウンロードはWEBメールの添付ファイルが最初の目的でしたが、Slack や Facebook Cybozu 等、現在はPHPのコードで大体可能です。この話を聞いた某編集者がハッキングだと言われましたが、普通に自分でログインしてダウンロードするのと基本的に変わりませんので、堂々とやって良い処理です。以下、PHPだと selenium-webdriverを利用する事になる訳で、今になりPythonの場合と比較して複雑に感じます。PHPで動かす場合には次の記事を参考にさせていただきました。この記事にあるように準備が色々とあります。「seleniumを使ってPHPでChromeの自動操作をする」その準備を終えて、seleniumを起動します。

1.PHP編(seleniumの起動)

java -jar selenium-server-standalone.jar &
2.PHP編(実際にログインしダウンロードまで行きます)

このコード、一部意図的では無い部分があります。結果的に試行錯誤して上手くログインしてダウンロード出来たので採用したコードで、例えばスクリーンショットも不要ですが、撮るとダウンロード出来たのでそのまま残したものです。PHPでseleniumは以外に大変なのかもしれません。これからPythonで同じ事をやるとどうなるか楽しみですが、Pythonの場合もseleniumのインストールを別途やらなくてはならないので、同じ環境でやって良いものか気になります。

download.php
require_once './vendor/autoload.php';

use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\WebDriverExpectedCondition;
use Facebook\WebDriver\WebDriverBy;

// ダウンロードしたchromedriverのパスを指定
$screenPath = $relative.'/g_screenshot.png';
$driverPath = '/usr/local/bin/chromedriver';
putenv("webdriver.chrome.driver=" . $driverPath);
// Chromeを起動するときのオプション指定用
$options = new ChromeOptions();
// ヘッドレスで起動するように指定
$options->addArguments([
'--no-sandbox',
'--headless',    // ヘッドレスで起動するように指定。ダウンロードフォルダ指定が無効になる。
'--disable-gpu',    // ヘッドレスで暫定的に必要なフラグ
'--ignore-certificate-errors',  // SSLセキュリティ証明書のエラーページ(「このサイトのセキュリティ証明書は信頼できません」のページ)を表示しません。
]);
$caps = DesiredCapabilities::chrome();
$caps->setCapability(ChromeOptions::CAPABILITY, $options);
$driver = ChromeDriver::start($caps, null, 1000*60*5, 1000*60*10);
$path = dirname(__FILE__).'/data'; # ダウンロードされるWEBサーバーのパス(このプログラムからのパス)
$this->setDownloadDir($driver, $path);
$driver->manage()->window()->maximize();

// 仮想ログイン、$atarget はダウンロードするファイルのリンク
$driver->get($wtarget); # このリンク先のファイルがダウンロードされます。
$element = $driver->findElement(WebDriverBy::name('username'));
$element->sendKeys($wuser);
$element = $driver->findElement(WebDriverBy::name('password'));
$element->sendKeys($wpass);
$element->submit();
$driver->manage()->timeouts()->implicitlyWait(5);
$driver->takeScreenshot($screenPath);
//$driver->manage()->getCookies();
// 仮想ログイン完了
3.PHPで構築した環境で from selenium import webdriver が動作しない

この問題ですが、
Python 3.7.5 (default, Nov 1 2019, 19:15:52) では未だにエラーになっているのですが、もう一つの
Python 2.7.17 (default, Oct 25 2019, 10:08:31) ではすんなり動きます。二つの環境がそれぞれ呼び出すモジュールの関係なのでしょう。

webdriver.py

# 限りなく自分用のメモです。
from selenium import webdriver # from <module> import <driver>
# ImportError: cannot import name 'webdriver' from 'selenium' (unknown location)

ほぼパスの問題だと思いますが、Python 3.7.5 はエラーのままになっています。

4.google-chrome と chromedriver のバージョンの問題かもしれない

selenium をPHPで動かし出した時期にPythoのサンプルでテストをしていたのですが、その時期には動いていたPythonのサンプルがwebdriverを読み込んだ時点で止まります。そのエラーは google-chrome のバージョンと chromedriver のバージョンを示していて、クラッシュしている雰囲気なのです。PHPについては現在実装されている google-chrome と chromedriver を変えると逆に google-chrome がクラッシュします。この関係は何か理由がありそうなのです。少々悩みます。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1