問題タブ [invocationhandler]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - No-op InvocationHandler を作成する
InvocationHandler
JavaとProxy
クラスを使用してノーオペレーションの「リスナー」を作成しようとしています。以下の実装がすべてのシナリオを処理できるかどうか、またそれが最適なソリューションであるかどうかはわかりません。私が本当に望んでいるのは、このクラスが影響を与えないことです。以下よりもこの概念を表現するより良い方法はありますか?
おそらく、私はここで間違ったツリーを吠えています。繰り返しになりますが、これは、リスナー インターフェイスの初期化時にサロゲート、プレースホルダー、またはNull オブジェクトを簡単に作成できるようにすることを目的としています。ここでの考え方は、このリスナーを注入して、null
参照への偶発的な呼び出しを防ぐことができるということです。私がここでやろうとしていることを達成するためのより良い方法はありますか? または、私が知らないオープン ソース プロジェクトで誰かが似たようなことを書いたことがありますか? 私はグアバのことを知ってOptional
いますが、それは私が本当に望んでいるものではありません.
java - Java 7 - すべての、その他の、多くのメソッドをデフォルトで委譲しないカスタム メソッドの装飾
カスタムで閉じるために、インターフェイスPreparedStatementを装飾したいと思います(単なる例です)。
PreparedStatement
これは、 の既存のインスタンスをデコレートして、 が呼び出されているときに他のコードを呼び出したいことを意味しclose()
ます。
そのためには、ここで行われたように、内部オブジェクトへの呼び出しを委任するためだけに、デコレーターの数十のメソッドすべてをデフォルトで実装する必要があります。欠点は、多くの作業とコードに付加価値がほとんどないことです。PreparedStatement
もう 1 つのオプションは、Java のProxy と InvocationHandlerを使用して、単一のメソッドですべてのメソッドのデリゲートを行うデフォルトの実装を提供することです。カスタム メソッドが存在する場合、InvocationHandlerはそのメソッドに呼び出しを送信します。ここで例を参照してください。このソリューションの問題は、カスタム メソッドを as としてマークできず、その署名が正しいかどうかをチェックできないことです。これは、プロキシがインスタンス化できない@Override
abstract が必要になるためです。PreparedStatement
それで、これはできますか?どのように?
* Java 7 max を使用して実装できる必要がありますが、Java 8 の回答を自由に提供してください。
selenium - プロキシ ラッパーを使用した後、そのような要素の例外はありません
Web ページのランダム ポップアップを閉じるために、Web 要素をプロキシ ラッパーでラップするチュートリアルに従いました: https://www.vinsguru.com/selenium-webdriver-how-to-handle-annoying-random-ポップアップアラート/
このソリューションをコードに実装した後、ランダム ポップアップは閉じられましたが、以前にはなかった「そのような要素の例外はありません」が発生しました。さまざまな要素とメソッドを使用してコード行を変更しようとしましたが、どのアクションもこの問題を解決しませんでした。どの要素も認識されませんでした。
私はどんな助けにも感謝します:)
例外の原因となったメソッド (最後の行):
プロキシ ページ ファクトリ クラス:
要素ガード クラス:
要素プロキシ クラス:
エラー:
org.openqa.selenium.support.ui.ExpectedConditions.elementIfVisible(ExpectedConditions.java:314) の com.sun.proxy.$Proxy27.isDisplayed (不明なソース) の java.lang.reflect.UndeclaredThrowableException (org.openqa.selenium の)。 support.ui.ExpectedConditions.access$000(ExpectedConditions.java:43) at org.openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:300) at org.openqa.selenium.support.ui.ExpectedConditions$10 .apply(ExpectedConditions.java:297) at org.openqa.selenium.support.ui.FluentWait.lambda$checkConditionInLoop$2(FluentWait.java:233) at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run( CompletableFuture.java:1764) で java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1756) で java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) でjava.base/java にあります。java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665) の util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1016) java.base/java.util.concurrent.ForkJoinPool. runWorker(ForkJoinPool.java:1598) at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) at ✽.ブロック(file:///C:/Users)を呼び出すアクションを実行/may/Desktop/automation-git/GTH-QA/cucumber/features/Blocks.feature:9) 原因: java.lang.reflect.InvocationTargetException at jdk.internal.reflect.GeneratedMethodAccessor6.invoke(Unknown Source) at java. base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で java.base/java.lang.reflect.Method.invoke(Method.java:564) で infrastructure.ElementProxy.invoke(ElementProxy.java: 27) com.sun.proxy.$Proxy27 で。org.openqa.selenium.support.ui.ExpectedConditions.elementIfVisible(ExpectedConditions.java:314) の isDisplayed (不明なソース) org.openqa.selenium.support.ui.ExpectedConditions.access$000(ExpectedConditions.java:43) の org .openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:300) at org.openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:297) at org.openqa.selenium.support .ui.FluentWait.lambda$checkConditionInLoop$2(FluentWait.java:233)、java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1764)、java.base/java.util.concurrent で。 CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1756) で java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) で java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec( ForkJoinPool.java:1016) java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665) で java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1598) で java.base/java .util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) 原因: org.openqa.selenium.NoSuchElementException: そのような要素はありません: 要素が見つかりません: {"method":"xpath","selector":"/ /div[contains(text(),'SEARCH RESULTS')]"} (セッション情報: chrome=86.0.4240.111) このエラーに関するドキュメントについては、次のサイトを参照してください。そのような要素はありません: 要素が見つかりません: {"method":"xpath","selector":"//div[contains(text(),'SEARCH RESULTS')]"} (セッション情報: chrome=86.0.4240.111 ) このエラーに関するドキュメントについては、次のサイトを参照してください。そのような要素はありません: 要素が見つかりません: {"method":"xpath","selector":"//div[contains(text(),'SEARCH RESULTS')]"} (セッション情報: chrome=86.0.4240.111 ) このエラーに関するドキュメントについては、次のサイトを参照してください。https://selenium.dev/exceptions/#no_such_element *** 要素情報: {Using=xpath, value=//div[contains(text(),'SEARCH RESULTS')]} at jdk.internal.reflect.GeneratedConstructorAccessor15.newInstance(Unknown Source) at java.base/jdk .internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) で java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:500) で java.base/java.lang.reflect.Constructor.newInstance (Constructor.java:481) org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:196) で org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java) :129) org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:53) で org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:160) で org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83) org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:582) org.openqa.selenium.remote.RemoteWebDriver.findElement( RemoteWebDriver.java:333) org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) org.openqa.selenium.By$ByXPath.findElement(By.java:394) org.openqa.selenium org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) の .remote.RemoteWebDriver.findElement(RemoteWebDriver.java:325) org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke の(LocatingElementHandler.java:39) at com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17 詳細java:83) org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:582) で org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:333) で org.openqa.selenium.remote .RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) at org.openqa.selenium.By$ByXPath.findElement(By.java:394) at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:325) org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) の org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:39) の com.sun.proxy. $Proxy25.isDisplayed(Unknown Source) ... 17 続きを読むjava:83) org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:582) で org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:333) で org.openqa.selenium.remote .RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) at org.openqa.selenium.By$ByXPath.findElement(By.java:394) at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:325) org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) の org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:39) の com.sun.proxy. $Proxy25.isDisplayed(Unknown Source) ... 17 続きを読むjava:333) org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) で org.openqa.selenium.By$ByXPath.findElement(By.java:394) で org.openqa.selenium.remote org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) の .RemoteWebDriver.findElement(RemoteWebDriver.java:325) org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler) .java:39) at com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17 詳細java:333) org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) で org.openqa.selenium.By$ByXPath.findElement(By.java:394) で org.openqa.selenium.remote org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) の .RemoteWebDriver.findElement(RemoteWebDriver.java:325) org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler) .java:39) at com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17 詳細findElement(DefaultElementLocator.java:70) at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:39) at com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17もっとfindElement(DefaultElementLocator.java:70) at org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke(LocatingElementHandler.java:39) at com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... 17もっと