我正在创建一个可重复使用的功能来处理帧,并想在fantasy11网站上点击“我不是机器人”复选框。这是一个例外 - 。 请帮忙。。
我已经尝试了很多,但努力获得正确的结果。
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
public class section9frames {
public static void main(String[] args) {
// TODO Auto-generated method stub
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]"));
driver.switchTo().frame(number);
driver.findElement(By.xpath(".//*[@id='recaptcha-anchor']/div[5]")).click();
driver.switchTo().defaultContent();
int number1=findframenumber(driver,By.xpath(".//*[@id='recaptcha-verify-button']"));
driver.switchTo().frame(number1);
driver.findElement(By.xpath(".//*[@id='recaptcha-verify-button']")).click();
}
public static int findframenumber(WebDriver driver,By by) {
int i;
int framecount=driver.findElements(By.tagName("iframe")).size();
for (i=0;i<framecount;i++) {
driver.switchTo().frame(i);
int count=driver.findElements(by).size();
if(count>0) {
break;
} else{
}
}
driver.switchTo().defaultContent();
return i;
}
}
答案 0 :(得分:0)
我一直在使用自己的API包装器来进行常见的WebElement交互。我使用java.lang.reflect.Proxy类通过Decorator Pattern解决了这个问题。
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();
}
}
}) ;
}
对于上面的示例,您需要将实用程序方法设置为静态,以便从main引用它们,但它看起来像这样:
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()
}
希望有所帮助!