我一直在工作,共同WebElement相互作用我自己的API的包裝。我使用java.lang.reflect.Proxy類通過裝飾模式解決了這個問題。
public void exampleUse() {
WebDriver driver = new FirefoxDriver();
int frameIdInt = 1;
String frameId ="someFrame";
WebElement frameRef = driver.findElement(By.id(frameId));
WebElement inFrameByIntId = frameSafeElement(driver, frameIdInt, By.id("element"));
WebElement inFrameByStringId = frameSafeElement(driver, frameId, By.id("element"));
WebElement inFrameByReference = frameSafeElement(driver, frameRef, By.id("element"));
// Now you should be able to do anything you want with the WebElement through the WebElement API. All
// invocations will go through the Proxy instance below which will switch to the frame, resolve the WebElement
// reference in context of the frame, perform the desired function against the resolved WebElement, switch back
// to default context, and return the results from the delegate invocation.
}
private final WebElement frameSafeElement(final WebDriver driver, final String frameId, final By lookup) {
return (WebElement) java.lang.reflect.Proxy.newProxyInstance(getClass().getClassLoader(), new Class<?>[]{WebElement.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
driver.switchTo().frame(frameId);
WebElement element = driver.findElement(lookup);
return method.invoke(element, args);
} finally {
driver.switchTo().defaultContent();
}
}
}) ;
}
private final WebElement frameSafeElement(final WebDriver driver, final int frameId, final By lookup) {
return (WebElement) java.lang.reflect.Proxy.newProxyInstance(getClass().getClassLoader(), new Class<?>[]{WebElement.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
driver.switchTo().frame(frameId);
WebElement element = driver.findElement(lookup);
return method.invoke(element, args);
} finally {
driver.switchTo().defaultContent();
}
}
}) ;
}
private final WebElement frameSafeElement(final WebDriver driver, final WebElement frameReference, final By lookup) {
return (WebElement) java.lang.reflect.Proxy.newProxyInstance(getClass().getClassLoader(), new Class<?>[]{WebElement.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
try {
driver.switchTo().frame(frameReference);
WebElement element = driver.findElement(lookup);
return method.invoke(element, args);
} finally {
driver.switchTo().defaultContent();
}
}
}) ;
}
對於你上面的例子,你需要做的實用方法靜態從您的主要參考他們,但它會是這個樣子:
public static void main(String[] args) {
WebDriver driver=new FirefoxDriver();
driver.get("https://fantasycricket.dream11.com/IN/");
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
int number=findframenumber(driver,By.xpath(".//*[@id='recaptcha-anchor']/div[5]"));
WebElement firstFrameObject = frameSafeElement(driver, number, By.xpath(".//*[@id='recaptcha-anchor']/div[5]"));
firstFrameObject.click();
int number1=findframenumber(driver,By.xpath(".//*[@id='recaptcha-verify-button']"));
WebElement secondFrameObject = frameSafeElement(driver, number, By.xpath(".//*[@id='recaptcha-verify-button']"));
secondFrameObject.click()
}
希望幫助!
什麼是例外? –
線程「main」中的異常org.openqa.selenium.NoSuchFrameException:無法定位幀:1 –
因此,您正在編寫代碼來創建一個機器人以避開試圖阻止機器人的功能...不要這樣做。 – JeffC