2015-10-15 17 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

我一直在工作,共同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() 
} 

希望幫助!

+0

謝謝Jeremiah尋求快速解決方案......如果你能幫我糾正** findframenumber(WebDriver driver,By by)** –

+0

我認爲如果你將問題轉移到StackOverflow的話, findframenumber到另一篇文章,因爲這將超出你原來關於可重用iframe方法的查詢範圍。請注意其他人留下的評論,並提供有關此問題的更多詳細信息以及您要實現的目標。你對這個問題越具體,人們越容易理解問題並提供幫助。我會盡力留意那條線索,並提供我可以提供的幫助,但那個特別的努力有點不在我的掌控之中。祝你好運 – Jeremiah

+0

我只是想創建將遍歷每個框架**的可重用函數,並嘗試使用** size()** List方法來檢查元素的可用性來定位元素。函數應該返回索引。如果我們考慮性能,我知道這不是有效的方式。我只是試圖以不同的方式進行幀查找。 –