利用可重用函数来处理框架

时间:2015-10-15 10:10:58

标签: java selenium xpath selenium-webdriver webdriver

  

我正在创建一个可重复使用的功能来处理帧,并想在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;
    }
}

Please have a look into the image

1 个答案:

答案 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()
 }

希望有所帮助!

相关问题