我想開發一個AspectJ方面,它會自動吞下任何ElementNotVisibleException
或StaleElementReferenceException
S按硒-Java的WebDriver
情況下拋出(的RuntimeException
子類)(包括WebDriver
多個子類 - ChromeDriver
,FirefoxDriver
等)如何使用第三方maven dependency的執行切入點?
基本上,在非AOP上下文中處理ENVE
和SERE
異常的標準建議解決方案與Selenium是簡單地再試一次。然後再次。如果有必要,再一次。
像這樣的東西會在功能模式工作:使用webdriver的時後
public void tryWhileStale(Runnable r)
{
int n = 0;
while(n < 5)
{
try
{
r.run();
break;
}
catch(StaleElementReferenceException | ElementNotVisibleException e){}
n++;
Thread.sleep(2000);
}
throw new RuntimeException("Timed out retrying");
}
然後:
tryWhileStale(() -> driver.findElement(By.xpath(...)).click());
然而,這增加了不少額外的輸入(以及作爲意外忘記tryWhileStale()
包裝的真實可能性)我想避免。
我不想下載selenium-java的副本,編輯源代碼並重新編譯,因爲我直接從公共Maven存儲庫中提取Selenium。
我希望AspectJ能夠弄清楚如何做到這一點,所以我做了一些研究,並意識到我需要around
建議execution
切入點。如果我使用call
而不是execution
,它將成功觸發,但它不會吞下異常。這對我來說是神祕的,因爲從我的代碼流中看來,我寫的方面會捕獲proceed()調用中引發的任何內容。
但是execution()
切入點也不起作用!這是因爲AspectJ正在編織我的類,但是不編織Selenium-Java,即使我的pom.xml中有weaveDependency
!該踢球是call()
只適用於你的類是編織,而execution()
只適用於如果你是叫是編織類。顯然,如果你有你的課程和第三方課程編織,任何一個都可以工作。
有沒有辦法做到這一點,而不會完全放棄AOP或Maven?下面是我的代碼應該據稱工作如果我能織硒的Java:
@Aspect
class MyAspect {
@Around("execution (WebElement *.findElement(By))")
public Object around(ProceedingJoinPoint pjp)
{
Object f = null;
int n = 0;
do
{
try
{
System.err.println("Before " + this.toString());
f = pjp.proceed();
System.err.println("After " + this.toString());
return f;
}
catch(Throwable t)
{
try { Thread.sleep(5000); } catch(InterruptedException ie) { break; }
System.err.println("Waiting 5 seconds because of " + t.getClass().getSimpleName());
}
n++;
} while(n < 5);
System.err.println("Gave up waiting");
return null;
}
}
所以我想你應用這種方法來編織依賴http://www.mojohaus.org/aspectj-maven-plugin/examples/weaveJars.html,插件執行綁定到哪個階段? –
在這種情況下,我看不到任何爲什麼'call()'不起作用的原因。你能否描述究竟是什麼問題? – kriegaex