[#50752] [質問] rescue節で、他パッケージのメッセージ出力を抑止したい — Takahiro Yamaguchi <yamataka@...08.itscom.net>

10 messages 2019/05/02

[ruby-list:50753] Re: [質問] rescue節で、他パッケージのメッセージ出力を抑止したい

From: "Masa Sakano" <imagine@...>
Date: 2019-05-02 12:10:15 UTC
List: ruby-list #50753
坂野正明です。

On 2 May 2019, at 4:15, Takahiro Yamaguchi wrote:

> 山口と申します。
>
> 下記のプログラム(抜粋)を実行すると、
>
> @wait = Selenium::WebDriver::Wait.new(timeout: 10)
>
>   begin
>    [INFO] Checking alertTitle dialog ...
>     dialog_alert = @wait.until { @driver.find_element(id: 
> "com.aspiro.tidal:id/alertTitle").displayed? }
>
>     if dialog_alert
>       puts "[WARN] alertTitle dialog appeared!"
>       puts "[WARN] Clickc OK! to continue"
>       @driver.find_element(id: "android:id/button1").click
>     else
>       puts "[ERROR] alertTitle dialog not appeared!"
>     end
>   rescue # Selenium::WebDriver::Error::TimeoutError
>     puts "[INFO] No alertTitle dialog"
>   end
>
>
> 出力が、下記の様になり、
>
> [INFO] Checking alertTitle dialog …
> 2019-05-02 12:06:59 WARN Selenium [DEPRECATION] 
> Selenium::WebDriver::Error::TimeOutError is deprecated. Use 
> Selenium::WebDriver::Error::TimeoutError (ensure the driver supports 
> W3C WebDriver specification) instead.
> [INFO] No alertTitle dialog
>
> rescue節で、
>
> 2019-05-02 12:06:59 WARN Selenium [DEPRECATION] 
> Selenium::WebDriver::Error::TimeOutError is deprecated. Use 
> Selenium::WebDriver::Error::TimeoutError (ensure the driver supports 
> W3C WebDriver specification) instead.
>
> 他パッケージの出力が表示されるのを、抑止したいのですが、
> 良い方法をご教示いただけますでしょうか?

「良い」方法ではありませんが、該当箇所で一時的に 
STDERRの出力を抑止すれば、当座の解決にはなりましょうか。

例えば、以下のようなメソッドを定義します。
https://gist.github.com/bec1858c7b2555106beccd93e9cb65b2.git

     # @param backup_file [String] Filename to backup STDERR
     # @return [Object] Returned value of the given block
     # @yield [] Block to execute, in which STDERR is suppressed.
     def suppress_stderr(backup_file='/dev/null')
       stderr_orig = $stderr
       $stderr.sync
       $stderr.reopen(backup_file, 'w')
       yield
     ensure
       $stderr.sync
       $stderr = stderr_orig
     end

これを用いて、もし該当の警告メッセージが 
`@wait.until` 
実行中に出ているならば、以下のようにできます。

     dialog_alert = suppress_stderr {
       @wait.until { @driver.find_element(id: 
"com.aspiro.tidal:id/alertTitle").displayed? }
     }

あるいは、begin 
節全体をブロックに入れて指定することも勿論できます。

なお、提示のケースの場合、
「rescue節で」警告メッセージが表示されているのではなく、Exception 
が raise される直前、
すなわち 
rescueに飛ぶ直前に、警告メッセージが表示されているのでしょう。

ご参考までに。

坂野正明

In This Thread