1

Web ページのランダム ポップアップを閉じるために、Web 要素をプロキシ ラッパーでラップするチュートリアルに従いました: https://www.vinsguru.com/selenium-webdriver-how-to-handle-annoying-random-ポップアップアラート/

このソリューションをコードに実装した後、ランダム ポップアップは閉じられましたが、以前にはなかった「そのような要素の例外はありません」が発生しました。さまざまな要素とメソッドを使用してコード行を変更しようとしましたが、どのアクションもこの問題を解決しませんでした。どの要素も認識されませんでした。

私はどんな助けにも感謝します:)

例外の原因となったメソッド (最後の行):

private void search(String gameName) {
    Wait.visible(homeBtn);
    Methods.click(searchBtn);
    Methods.sendKeys(searchBox, gameName);  
    Wait.visible(searchResultsTitle);    
}

プロキシ ページ ファクトリ クラス:

public class ProxyPageFactory {

 public static <T> void initElements(WebDriver driver, T pageobject){
        
     //first init elements
     PageFactory.initElements(driver, pageobject);
        
     //then access all the WebElements and create a wrapper
     for(Field f: pageobject.getClass().getDeclaredFields()){
         if(f.getType().equals(WebElement.class)){
             boolean accessible = f.isAccessible();
             f.setAccessible(true);
         
             //reset the webelement with proxy object
             try {
                 f.set(pageobject, ElementGuard.guard((WebElement)f.get(pageobject))); 
             } catch (IllegalArgumentException e) {         
                 e.printStackTrace();
             } catch (IllegalAccessException e) {
                 e.printStackTrace();
             }          
         
        f.setAccessible(accessible);
     }  
  }
}

要素ガード クラス:

public class ElementGuard {

public static WebElement guard(WebElement element) {
    ElementProxy proxy = new ElementProxy(element);
    WebElement wrappdElement = (WebElement) Proxy.newProxyInstance(ElementProxy.class.getClassLoader(),
                                                                   new Class[] { WebElement.class },
                                                                   proxy);
    return wrappdElement;
}

要素プロキシ クラス:

public class ElementProxy implements InvocationHandler {

   private final WebElement element;

   public ElementProxy(WebElement element) {
       this.element = element;
   }

   @Override
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      //before invoking actual method check for the popup
      this.checkForPopupAndKill();
      return  (method.invoke(element, args));
   }

   private void checkForPopupAndKill() {    
     // closing the pop up
   } }

エラー:

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もっと

4

1 に答える 1