質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
PyAutoGUI

PyAutoGUIは、Windows、Mac OS、Linuxに対応した、Python用のGUI自動化ライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2307閲覧

pytestでtestとdebugで挙動が異なる部分はどこでしょうか?

ShortArrow

総合スコア141

PyAutoGUI

PyAutoGUIは、Windows、Mac OS、Linuxに対応した、Python用のGUI自動化ライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/17 08:22

前提・実現したいこと

pyautoguiを使用して、RPAアプリケーションの開発を行っています。
この時、testだとフリーズするのに、debugだとtestをpassできます。
この挙動の違いはどこから来るのか思い当たることが無いので、
ご存知の方がいらっしゃいましたらご教授願います。

または、どこの挙動が違うかわからなくても回避できる方法がございましたら、
それも知りたいです。

test、debugともに、vscodeのmicrosoft公式拡張機能「Python」によって追加される、
「三角フラスコアイコン」から辿ってアイコンクリックで起動しています。

テスト用のライブラリにはpytestを利用しています。

発生している問題・エラーメッセージ

def WaitWindowLoadWithImgでフリーズしているということまでしかわかりませんでした。

該当のソースコード

テスト対象のモジュールの中でフリーズしている部分です。

py

1def WaitWindowLoadWithImg(nameforimg:str,timeforwait:int,nameforwindow:str,ratioforcut:tuple) -> bool: 2 """ 3 Check if the window is loaded using the image. 4 ---------- 5 6 Parameters: 7 ---------- 8 nameforimg:str 9 Specify the image you want to find by the name of the file. 10 nameforwindow:str 11 Specify the window you want to find by the name. 12 timeforwait:int 13 Specifies the number of times to continue the check every second. 14 ratioforcut: tuple 15 Specifies which range in the Window to check. 16 (leftRatio,topRatio,widthRatio,heightRatio) 17 18 Returns: 19 ---------- 20 bool: Returns true if a window with the specified name is found in time and the same part of the image is found in that window. 21 """ 22 """[summary] 23 24 Raises: 25 WndNotFoundError: [description] 26 27 Returns: 28 [type]: [description] 29 """ 30 pyautogui.moveTo(2,2) 31 shotRatio=None 32 for HowManyTime in range(timeforwait): 33 titles = get_window_titles() 34 if nameforwindow in titles: 35 getrect=GetWindowRectFromName(nameforwindow) 36 shotRatio=CutRectByRatio(Rect=getrect,Ratio=ratioforcut) 37 pos = pyautogui.locateCenterOnScreen(GetImage(nameforimg), region=shotRatio) 38 if pos != None: 39 return True 40 sleep(1) 41 # print(shotRatio) 42 43 pyautogui.screenshot(imageFilename=("img/timeline/"+datetime.datetime.now().strftime('%Y%m%d%H%M%S')+nameforwindow+"-"+nameforimg+".png"),region=shotRatio) 44 raise WndNotFoundError('timeout : "' + GetImage(nameforimg) + '"') 45 return False

こんな感じで使用します。

py

1def test_search(): 2 res=winctrl.WaitWindowLoadWithImg( 3 nameforwindow="検索", 4 timeforwait=20, 5 ratioforcut=(0, 0, 0.5, 0.3), 6 nameforimg="serchresult", 7 ) 8assert res

試したこと

testをするとraise WndNotFoundErrorで止まりますが、debugだとスッキリreturn Trueしてくれてpassするので、
完全に詰みました。testモードで実行するとprint()も使えないし、ブレークポイントも使えません。私の脳味噌はStackoverflowしました。

補足情報(FW/ツールのバージョンなど)

pipList

1appdirs 1.4.4 2astroid 2.4.2 3atomicwrites 1.4.0 4attrs 20.2.0 5autopep8 1.5.4 6black 20.8b1 7certifi 2020.6.20 8click 7.1.2 9colorama 0.4.3 10cx-Oracle 8.0.1 11iniconfig 1.0.1 12isort 5.5.2 13lazy-object-proxy 1.4.3 14mccabe 0.6.1 15more-itertools 8.5.0 16MouseInfo 0.1.3 17mypy-extensions 0.4.3 18numpy 1.19.2 19packaging 20.4 20pathspec 0.8.0 21Pillow 7.2.0 22pip 20.2.3 23pluggy 0.13.1 24py 1.9.0 25PyAutoGUI 0.9.50 26pycodestyle 2.6.0 27PyGetWindow 0.0.8 28pylint 2.6.0 29PyMsgBox 1.0.8 30pyodbc 4.0.30 31pyparsing 2.4.7 32pyperclip 1.8.0 33PyRect 0.1.4 34PyScreeze 0.1.26 35pytest 6.0.2 36PyTweening 1.0.3 37regex 2020.7.14 38rope 0.17.0 39setuptools 49.6.0.post20200814 40six 1.15.0 41toml 0.10.1 42tqdm 4.49.0 43typed-ast 1.4.1 44typing-extensions 3.7.4.3 45wheel 0.35.1 46wincertstore 0.2 47wrapt 1.12.1 48yapf 0.30.0

vscodeinfo

1バージョン: 1.49.0 (system setup) 2コミット: e790b931385d72cf5669fcefc51cdf65990efa5d 3日付: 2020-09-10T13:22:08.892Z 4Electron: 9.2.1 5Chrome: 83.0.4103.122 6Node.js: 12.14.1 7V8: 8.3.110.13-electron.0 8OS: Windows_NT x64 10.0.18363

condaList

1# Name Version Build Channel 2appdirs 1.4.4 pypi_0 pypi 3astroid 2.4.2 pypi_0 pypi 4atomicwrites 1.4.0 pypi_0 pypi 5attrs 20.2.0 pypi_0 pypi 6autopep8 1.5.4 pypi_0 pypi 7black 20.8b1 pypi_0 pypi 8ca-certificates 2020.6.20 hecda079_0 conda-forge 9certifi 2020.6.20 py38h32f6830_0 conda-forge 10click 7.1.2 pypi_0 pypi 11colorama 0.4.3 pypi_0 pypi 12cx-oracle 8.0.1 pypi_0 pypi 13iniconfig 1.0.1 pypi_0 pypi 14isort 5.5.2 pypi_0 pypi 15lazy-object-proxy 1.4.3 pypi_0 pypi 16mccabe 0.6.1 pypi_0 pypi 17more-itertools 8.5.0 pypi_0 pypi 18mouseinfo 0.1.3 pypi_0 pypi 19mypy-extensions 0.4.3 pypi_0 pypi 20numpy 1.19.2 pypi_0 pypi 21openssl 1.1.1g he774522_1 conda-forge 22packaging 20.4 pypi_0 pypi 23pathspec 0.8.0 pypi_0 pypi 24pillow 7.2.0 pypi_0 pypi 25pip 20.2.3 py_0 conda-forge 26pluggy 0.13.1 pypi_0 pypi 27py 1.9.0 pypi_0 pypi 28pyautogui 0.9.50 pypi_0 pypi 29pycodestyle 2.6.0 pypi_0 pypi 30pygetwindow 0.0.8 pypi_0 pypi 31pylint 2.6.0 pypi_0 pypi 32pymsgbox 1.0.8 pypi_0 pypi 33pyodbc 4.0.30 pypi_0 pypi 34pyparsing 2.4.7 pypi_0 pypi 35pyperclip 1.8.0 pypi_0 pypi 36pyrect 0.1.4 pypi_0 pypi 37pyscreeze 0.1.26 pypi_0 pypi 38pytest 6.0.2 pypi_0 pypi 39python 3.8.5 h60c2a47_7_cpython conda-forge 40python_abi 3.8 1_cp38 conda-forge 41pytweening 1.0.3 pypi_0 pypi 42regex 2020.7.14 pypi_0 pypi 43rope 0.17.0 pypi_0 pypi 44setuptools 49.6.0 py38h32f6830_0 conda-forge 45six 1.15.0 pypi_0 pypi 46sqlite 3.33.0 he774522_0 conda-forge 47toml 0.10.1 pypi_0 pypi 48tqdm 4.49.0 pypi_0 pypi 49typed-ast 1.4.1 pypi_0 pypi 50typing-extensions 3.7.4.3 pypi_0 pypi 51vc 14.1 h869be7e_1 conda-forge 52vs2015_runtime 14.16.27012 h30e32a0_2 conda-forge 53wheel 0.35.1 pyh9f0ad1d_0 conda-forge 54wincertstore 0.2 py38_1003 conda-forge 55wrapt 1.12.1 pypi_0 pypi 56yapf 0.30.0 pypi_0 pypi

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

pytestでの例外処理はハマりどころです。例外処理で止まるのは仕様です。
私の記事ですが、以下を参照してみてください。

https://qiita.com/toast-uz/items/d0aec4393bdd76feb2ff#%E8%A7%A3%E8%AA%ACb7-pytest%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E4%BE%8B%E5%A4%96%E5%87%A6%E7%90%86

投稿2020/09/17 11:05

toast-uz

総合スコア3266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShortArrow

2020/09/17 16:33

回答ありがとうございます。仕様なのはわかりました。ですが、debugでは絶対に例外処理に到達しないのに、なぜtestだと例外処理にたどり着くのでしょう?不思議ですよね。
toast-uz

2020/09/17 22:53

コメントありがとうございます。debugとtestで、pyautogui.locateの挙動が異なるのかも、ということですね。直接の回答ではありませんが、vscodeのsettings.jsonにおいて、"python.testing.pytestArgs"の中に"--capture=no",を追記すると、test成功時でもprint結果が表示されるので、testのデバッグに役立ちます。
ShortArrow

2020/10/20 00:48

`lacatecenteronscreen`の定義を辿ってみたら、中で`locateonscreen`に`**kwargs`を渡しておりました。そこで、`locateonscreen`の定義を見てみると、`minSearchTime=0, **kwargs`と分裂していました。使っていました。そしてその中で、`locate`という関数にすべて渡しているのですが、この時に`minSearchTime`は明示していませんでした。`locate`の定義をたどってみると`(variable) locateAll: (needleImage, haystackImage, grayscale=None, limit=10000, region=None, step=1, confidence=0.999) -> Generator[Box, None, None] | _AnyCallable`となっていました。 ゆっくりにしたら動くかな?という根拠のない発想と、途中にだけ存在したminSearchTime`は何者だ?という好奇心から、最初の`lacatecenteronscreen`に`minSearchTime`を適当に指定してみました。 そうしたら正常に動くようになりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問