くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

2018年08月

SeleniumとCypress

UIテストするのにSeleniumCypress(サイプレス)が最近のはやりの模様。

Seleniumを使うことにしたんですが、以下理由。

Cypressはセットアップが楽っていう評判なんだけど、Seleniumも別に大変じゃなかった。自分はChrome上で使う前提。スクリプトの言語はPythonで。

・Cypress==================================
#インスト
cd /your/project/path
npm install cypress --save-dev
#実行
./node_modules/.bin/cypress open

・Selenium==================================
#①Chromeのインスト
vi /etc/yum.repos.d/google-chrome.repo
 
#↑の中身
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/x86_64
enabled=1
gpgcheck=1
gpgkey=https://dl.google.com/linux/linux_signing_key.pub

#libOSMesa は CentOS7 でクラッシュする問題に対応するために入れた方がいいらしい。
yum -y install google-chrome-stable libOSMesa

#確認
google-chrome --version

#②ChromeDriverとフォントのインストール
yum -y install libX11 GConf2 fontconfig

#ChromeDriver持ってくる
#https://sites.google.com/a/chromium.org/chromedriver/downloadsのLastReleaseページ
wget https://chromedriver.storage.googleapis.com/2.41/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
mv chromedriver /usr/local/bin/

# IPA Fonts のインストール
yum -y install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
fc-cache -fv


#③Python3.6環境でseleniumのインスト
#仮想環境作る
python3.6 -m venv selenv
#仮想環境に切り替え
source bin/activate
#seleniumのインスト
pip install selenium

もちろんCypressの方が圧倒的に楽なんだけど、Seleniumも言うほど大変でもない。

Cypress使ってみて思ったのはスクリプト書くのが結構つらい。最初、Cypressのツール上でスクリプト書けるのかと思ってたんだけど、「好きなIDEでスクリプト書いてね♪」って公式に書いてあった。んーせめて、ページの要素のIDとかをコピペ出来たりみたいなサポートツール的なサムシングエルスが欲しい。相当ページの内容把握してないとサラサラとはかけなさそう。

その他、いくつか制約もあるみたいなのでちょっと微妙な気がする。性能が良いっていうのも見たけど、両方使ってみていまのとこ大差ないと思う。更新一杯するような複雑なスクリプト書くと違うんだろうか。

Cypressはまだまだ発展途上的な感じがする。インターフェースとかは好き。今後に期待。スクリプトを書くのがもっと楽になればいい感じになりそう。てかもうあるのかな?探してみた感じだとなさそうなんだけども。。。

SeleniumはKatalon RecorderをChrome拡張で入れれば、Chromeの操作記録をそのままPythonスクリプトに出来るのでかなり楽。ただ、スクリプトの中身、DOMの指定するとことかが正直微妙?

拡張性というかコードの保守していくとすぐ動かなくなりそう。そのまま使うのは無理っぽい。ただ、指定の仕方を変えればいいだけなので、1から書くよりは十分効率的かな。

スクリプト変える部分は例えば↓の感じ。

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
from selenium.webdriver.chrome.options import Options#ここが必要
import unittest, time, re

class UntitledTestCase(unittest.TestCase):
    def setUp(self):
        #↓ここ
        options = Options()
        options.add_argument('--headless')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-gpu')
        options.add_argument('--window-size=1280,1024')
        #↑ここ
        #self.driver = webdriver.Firefox()#ここを↓の行にする
        self.driver = webdriver.Chrome(chrome_options=options)#ここ

        self.driver.implicitly_wait(30)
        self.base_url = "https://www.katalon.com/"
        self.verificationErrors = []
        self.accept_next_alert = True
    
    def test_untitled_test_case(self):
        driver = self.driver
        driver.get("http://hoge.fuga.com/moe/")
        driver.save_screenshot('screenshot01.png')
        driver.find_element_by_link_text("Wiki").click()
        driver.save_screenshot('screenshot01.png')
    
    def is_element_present(self, how, what):
        try: self.driver.find_element(by=how, value=what)
        except NoSuchElementException as e: return False
        return True
    
    def is_alert_present(self):
        try: self.driver.switch_to_alert()
        except NoAlertPresentException as e: return False
        return True
    
    def close_alert_and_get_its_text(self):
        try:
            alert = self.driver.switch_to_alert()
            alert_text = alert.text
            if self.accept_next_alert:
                alert.accept()
            else:
                alert.dismiss()
            return alert_text
        finally: self.accept_next_alert = True
    
    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

if __name__ == "__main__":
    unittest.main()


===========================
実行は「python hoge.py」みたいな感じ。

Wine + CentOS でWindowsのバイナリ(32bit)を動かす

Linux上でWindowsのバイナリを動かしたくなった。64bit用のバイナリなら、Wineをepelあたりからyumで持って来れば使えそう。ただ、32bitのバイナリだと動かせない。「Bad EXE format」ていうエラーがでる。Wineを32bit版でインストールしないとダメらしいんだけど、yumで取れるのは現状64bit版のみ。32bitにするには自分でビルドからやらないといけない様子。

で、色々参考にWine3.xでやってみたんだけど、ちょっとはまったので記載。

とりあえずビルド。あー作業はrootでやった。CentOS7。

・既存が入ってる場合は削除
yum erase wine wine-*

・ビルドツールをインストール
yum install samba-winbind-clients -y
yum groupinstall 'Development Tools' -y
yum install libjpeg-turbo-devel libtiff-devel freetype-devel -y
yum install glibc-devel.{i686,x86_64} libgcc.{i686,x86_64} libX11-devel.{i686,x86_64} freetype-devel.{i686,x86_64} gnutls-devel.{i686,x86_64} libxml2-devel.{i686,x86_64} libjpeg-turbo-devel.{i686,x86_64} libpng-devel.{i686,x86_64} libXrender-devel.{i686,x86_64} alsa-lib-devel.{i686,x86_64} -y

#1 自分の環境では↓も入れないとダメでした。
yum install flex bison -y

#2 32bitをビルドする場合は↓も必要だった。
yum install glibc-devel libstdc++-devel icoutils openal-soft-devel prelink gstreamer-plugins-base-devel gstreamer-devel ImageMagick-devel fontpackages-devel libv4l-devel gsm-devel giflib-devel libXxf86dga-devel mesa-libOSMesa-devel isdn4k-utils-devel libgphoto2-devel fontforge libusb-devel lcms2-devel audiofile-devel
yum install glibc-devel.i686 dbus-devel.i686 freetype-devel.i686 pulseaudio-libs-devel.i686 libX11-devel.i686 mesa-libGLU-devel.i686 libICE-devel.i686 libXext-devel.i686 libXcursor-devel.i686 libXi-devel.i686 libXxf86vm-devel.i686 libXrender-devel.i686 libXinerama-devel.i686 libXcomposite-devel.i686 libXrandr-devel.i686 mesa-libGL-devel.i686 mesa-libOSMesa-devel.i686 libxml2-devel.i686 libxslt-devel.i686 zlib-devel.i686 gnutls-devel.i686 ncurses-devel.i686 sane-backends-devel.i686 libv4l-devel.i686 libgphoto2-devel.i686 libexif-devel.i686 lcms2-devel.i686 gettext-devel.i686 isdn4k-utils-devel.i686 cups-devel.i686 fontconfig-devel.i686 gsm-devel.i686 libjpeg-turbo-devel.i686 pkgconfig.i686 libtiff-devel.i686 unixODBC.i686 openldap-devel.i686 alsa-lib-devel.i686 audiofile-devel.i686 freeglut-devel.i686 giflib-devel.i686 gstreamer-devel.i686 gstreamer-plugins-base-devel.i686 libXmu-devel.i686 libXxf86dga-devel.i686 libieee1284-devel.i686 libpng-devel.i686 librsvg2-devel.i686 libstdc++-devel.i686 libusb-devel.i686 unixODBC-devel.i686 qt-devel.i686

・ソースを取得
cd /usr/src
wget http://dl.winehq.org/wine/source/3.x/wine-3.13.tar.xz
tar Jxfv wine-3.13.tar.xz

・ビルド
cd wine-3.13
mkdir -p wine32 wine64

cd wine64
../configure --enable-win64 --without-freetype
make -j 2

cd ../wine32
PKG_CONFIG_PATH=/usr/lib/pkgconfig ../configure --with-wine64=../wine64
make -j 2

make install
cd ../wine64
make install

・確認
which wine
which wine64

#1と#2の対応が自分の環境では必要でした。あとは文字化け対応系。

#epelのインスト
yum install epel-release

#cabextractのインスト
yum --enablerepo=epel install cabextract

#実行ファイルの取得
wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks

#実行権限の変更
chmod +x winetricks

#/usr/local/binへコピー
cp ./winetricks /usr/local/bin

#確認
winetricks --version

#フォントインスト
winetricks allfonts

そしたら、↓の感じで動かしたいEXEを実行する。

wine hogefuga.exe

ビルドは結局1時間くらいかかった気がする。。。

参考
https://blog.huwasaku.info/1656
https://ameblo.jp/kousakusya/entry-12333298836.html
https://www.centos.org/forums/viewtopic.php?t=49542

問合せ