нет такого исключения элемента после использования прокси-оболочки
Чтобы закрыть случайное всплывающее окно на моей веб-странице, я следовал руководству по упаковке веб-элементов с помощью прокси-оболочки:https://www.vinsguru.com/selenium-webdriver-how-to-handle-annoying-random-popup-alerts/
После реализации этого решения в моем коде случайное всплывающее окно закрылось, но я не обнаружил "исключения такого элемента", которого раньше не было. Я попытался изменить строку кода, используя различные элементы и методы, но ни одно из моих действий не решило эту проблему - ни один из элементов не был распознан.
Буду признателен за любую помощь:)
Метод, вызвавший исключение (последняя строка):
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
} }
Ошибка:
java.lang.reflect.UndeclaredThrowableException в com.sun.proxy.$Proxy27.isDisplayed(Неизвестный источник) в org.openqa.selenium.support.ui.ExpectedConditions.elementIfVisible(ExpectedConditions.java:314) в org.openqa.sesupport.ui.ExpectedConditions.access$000(ExpectedConditions.java:43) в org.openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:300) в org.openqa.selenium.support.ui.ExpectedConditions$10.apply(ExpectedConditions.java:297) в org.openqa.selenium.support.ui.FluentWait.lambda$checkConditionInLoop$2(FluentWait.java:233) в java.base/java.util.concurrent.CompletableFuture$AsyncSupplyCompletableFuture.java:1764) в java.base/java.util.concurrent.CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1756) в java.base/java.util.concurrent.ForkJoinTask.doExecask (Forkjava290) в java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1016) в java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665) в java.btilase.runWorker(ForkJoinPool.java:1598) в java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) в ✽. Я выполняю действие для вызова блока (файл:///C:/Users/may/Desktop/automation-git/GTH-QA/cucumber/features/Blocks.feature:9) Вызвано: java.lang.reflect.InvocationTargetException в jdk.internal.reflect.GeneratedMethodAccessor6.invoke(неизвестный источник) в java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.base/java.lang.reflect.Method.invoke(Method.java:564) в Infrastructure.ElementProxy.invoke(ElementProxy.invoke (Element 27) на com.sun.proxy.$Proxy27.isDisplayed(Неизвестный источник) в org.openqa.selenium.support.ui.ExpectedConditions.elementIfVisible(ExpectedConditions.java:314) в org.openqa.selenium.support.ui.ExpectedConditions.access$000(ExpectedConditions.java:43) в org.openqa.selenium.support.ui.ExpectedConditions10 долларов США (ExpectedConditions.java:300) в org.openqa.selenium.support.ui.ExpectedConditions10 долларов США (ExpectedConditions.java:297) в 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. CompletableFuture$AsyncSupply.exec(CompletableFuture.java:1756) по адресу java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290) по адресу java.base/ $ java.Exutil.concurrentue.ForkJoinQForkJoinPool.java:1016) в java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1665) в java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1598).util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183) Вызвано: org.openqa.selenium.NoSuchElementException: такого элемента нет: невозможно найти элемент: {"метод":"xpath","селектор": "/ / div [содержит (text (), 'РЕЗУЛЬТАТЫ ПОИСКА')] "} (Информация о сеансе: chrome = 86.0.4240.111) Для документации по этой ошибке посетите:нет такого элемента: невозможно найти элемент: {"метод":"xpath","селектор": "// div [содержит (текст (), 'РЕЗУЛЬТАТЫ ПОИСКА')]"} (Информация о сеансе: chrome = 86.0.4240.111) Для документации по этой ошибке посетите:нет такого элемента: невозможно найти элемент: {"метод":"xpath","селектор": "// div [содержит (текст (), 'РЕЗУЛЬТАТЫ ПОИСКА')]"} (Информация о сеансе: chrome = 86.0.4240.111) Для документации по этой ошибке посетите: https://selenium.dev/exceptions/#no_such_element*** Информация об элементе: {Using = xpath, value = //div[contains(text(),'SEARCH RESULTS')]} в jdk.internal.reflect.GeneratedConstructorAccessor15.newInstance(Неизвестный источник) в 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.java:481) на org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:196) на org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.w3c.W3CHttpResponseCodec.w3c.W3CHttpResponseCodec.w3c.:129) на org.openqa.selenium.remote.codec.w3c.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:53) на org.openqa.selenium.remote.HttpCommandExecutor.execute(HttporCommandavaeopenqa.selenium.remote.service.DriverCommandExecutor.execute (DriverCommandExecutor.java:83) по адресу org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:582) по адресу org.openqa.Elena.Remote. RemoteWebDriver.java:333) на org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) на org.openqa.selenium.By$ByXPath.findElement(By.java.lenium:394pen).remote.RemoteWebDriver.findElement(RemoteWebDriver.java:325) по адресу org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) по адресу org.openqa.selenium.support.(LocatingElementHandler.java:39) at com.sun.proxy.$Proxy25.isDisplayed(Unknown Source) ... еще 17java: 83) по адресу org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:582) в org.openqa.selenium.remote.RemoteWebDriver.findElement (RemoteWebDriver.java:333) в org.semote.RemoteWebDriver.findElementByXPath (RemoteWebDriver.java:451) в org.openqa.selenium.By$ByXPath.findElement(By.java:394) в org.openqa.selenium.remote.RemoteWebDriver.java: RemoteWebDriver.java. org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) в org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke (LocatingElementHandler.java). $ Proxy25.isDisplayed (Неизвестный источник)... еще 17java: 83) по адресу org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:582) в org.openqa.selenium.remote.RemoteWebDriver.findElement (RemoteWebDriver.java:333) в org.semote.RemoteWebDriver.findElementByXPath (RemoteWebDriver.java:451) в org.openqa.selenium.By$ByXPath.findElement(By.java:394) в org.openqa.selenium.remote.RemoteWebDriver.java: RemoteWebDriver.java. org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) в org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke (LocatingElementHandler.java). $ Proxy25.isDisplayed (Неизвестный источник)... еще 17java: 333) в org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) в org.openqa.selenium.By$ByXPath.findElement(By.java:394) в ormoa.selenq..RemoteWebDriver.findElement (RemoteWebDriver.java:325) по адресу org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) по адресу org.openqa.selenium.selenium.support.page.java: 39) на com.sun.proxy. $ Proxy25.isDisplayed (Неизвестный источник)... еще 17java: 333) в org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:451) в org.openqa.selenium.By$ByXPath.findElement(By.java:394) в ormoa.selenq..RemoteWebDriver.findElement (RemoteWebDriver.java:325) по адресу org.openqa.selenium.support.pagefactory.DefaultElementLocator.findElement(DefaultElementLocator.java:70) по адресу org.openqa.selenium.selenium.support.page.java: 39) на com.sun.proxy. $ Proxy25.isDisplayed (Неизвестный источник)... еще 17findElement (DefaultElementLocator.java:70) в org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke (LocatingElementHandler.java:39) в com.sun.proxy. $ Proxy25.isDisplayed (неизвестный источник)... 17 Больше findElement (DefaultElementLocator.java:70) на org.openqa.selenium.support.pagefactory.internal.LocatingElementHandler.invoke (LocatingElementHandler.java:39) на com.sun.proxy. $ Proxy25.isDisplayed (неизвестный источник)... 17 Больше
1 ответ
Благодарим за включение соответствующего кода. Не совсем понятно, что работает, а что не удается после работы со всплывающим окном, но похоже, что может быть проблема с одновременным определением всех элементов модели страницы. (Вот почему рекомендуется создавать экземпляры элементов только по мере необходимости, потому что, если страница является динамической, ссылки могут устареть.)
Было бы полезно узнать, успешно ли обнаруживался ли этот элемент раньше?
Unable to locate element: {"method":"xpath","selector":"//div[contains(text(),'SEARCH RESULTS')]"}
Если это так, ваш xpath в порядке, но ссылка на WebElement потеряла актуальность. Попробуйте воссоздать этот WebElement с нуля после всплывающего окна и посмотрите, решит ли это проблему. Возможно, вам придется обновлять данные модели страницы каждый раз, когда вы работаете со всплывающим окном.