2015-10-15 3 views
-2

Я создаю функцию многократного использования для обработки фреймов и хочу щелкнуть на флажке «Я не робот» на веб-сайте 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

+0

Зачем? –

+0

Исключение из потока «main» org.openqa.selenium.NoSuchFrameException: невозможно найти фрейм: 1 –

+0

Итак, вы пишете код, чтобы создать робота, чтобы обойти функцию, которая пытается предотвратить роботы ... не делайте этого , – JeffC

ответ

0

Я работал на моем API обертка для общих взаимодействий WebElement. Я решил эту проблему через шаблон Decorator, используя класс 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() 
} 

Надежда, что помогает!

+0

Спасибо, Jeremiah за быстрое решение ... Было бы здорово, если бы вы помогли мне исправить ** findframenumber (драйвер WebDriver, By by) ** –

+0

Я думаю, что это было бы в духе StackOverflow, если бы вы приняли проблемы с findframenumber к другому сообщению, так как это не выходит за рамки вашего исходного запроса о многоразовых методах iframe. Пожалуйста, обратите внимание на комментарии, оставленные другими, и предложите более подробную информацию о проблеме и о том, чего вы пытаетесь достичь. Чем более конкретны вы в этом вопросе, тем легче людям понять проблему и предложить помощь. Я постараюсь следить за этой нитью и предлагать какую помощь я могу, но эта конкретная работа немного из моей рулевой рубки. Best of Luck – Jeremiah

+0

Я просто хочу создать функцию многократного использования, которая будет ** пересекать каждый кадр ** и попытаться найти элемент, проверив доступность элемента с помощью метода ** size() ** интерфейса List. Функция должна возвращать индекс. Я знаю, что это не эффективный способ, если мы рассмотрим производительность. Я просто пытался выполнить поиск кадров по-разному. –