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