2013-02-01 21 views
1

在我的測試網頁我必須上傳一個文件,上傳者是基於閃存的。我用AutoIT上傳文件,但我的問題是我無法點擊該添加按鈕,以便上傳對話框顯示和autoIT可以完成其工作。 DIV [3]/DIV [2]/DIV/DIV /表/ tbody的/ TR [2]/TD/DIV /形式/ DIV/DIV [6]/DIV [1]/DIV [2] /對象「)) 。點擊();Automatin使用硒的Flash fileUploader

錯誤即時獲取是元素未找到錯誤.. 可以ü傢伙PLZ幫助我如何點擊該按鈕。我甚至使用過Firepath,Css,我不知道該怎麼做。 plz幫助

謝謝

回答

1

使用Selenium不能自動閃光的物體,它是方式出了什麼事情硒能做到的範圍。

你需要編輯AutoIT腳本來爲你點擊添加按鈕,Selenium將無法爲你做到這一點。

+1

謝謝Arran可以提供任何示例代碼或鏈接爲AutoIT單擊Flash對象... – selva

0

做雖然這個答案是不相關的硒,我認爲它可以幫助別人尋找一個答案這個問題。

我一直在這種情況之前,雖然不可能使用Selenium來「點擊」一個閃光按鈕,但是有一些東西比點擊那個按鈕還好,並繼續與你需要做的事情保持一致。

網頁上的任何Flash影片都像其他任何窗口一樣,只是不像其他任何元素那麼容易訪問,但是如果您足夠「低」,則可以枚舉屬於該瀏覽器實例的窗口並查找Flash窗口。

這樣的想法如下:

  1. 找到活動的瀏覽器實例(IE,FF,鉻等,在這種情況下IE)

    var ps = Process.GetProcessesByName("iexplore").Select(p => p.Id); 
    foreach (var handle in ps.SelectMany(EnumerateProcessWindowHandles)) 
    { 
        GetChildWindows(handle); 
        if (_macromediaFound != false){break;} 
    } 
    
  2. 列出所有它的子窗口(EnumerateWindowsEx使用Windows API)

    public static List<IntPtr> GetChildWindows(IntPtr parent) 
    { 
        List<IntPtr> result = new List<IntPtr>(); 
        GCHandle listHandle = GCHandle.Alloc(result); 
        try 
        { 
         EnumWindowProc childProc = new EnumWindowProc(EnumWindow); 
         EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle)); 
        } 
        finally 
        { 
         if (listHandle.IsAllocated) 
         listHandle.Free(); 
        } 
        return result; 
    } 
    
  3. 找到具有窗口W的窗口第i個被稱爲MacromediaFlashPlayerActiveX類名(這是在IE)

前面的代碼將調用EnumWindow每次它找到一個子窗口上的每個進程清單當然對步驟的功能(方法)1

private static bool EnumWindow(IntPtr handle, IntPtr pointer) 
    { 
     StringBuilder message = new StringBuilder(1000); 
     SendMessage(handle, WmGettext, message.Capacity, message); 
     StringBuilder classN = new StringBuilder(1000); 
     GetClassName(handle, classN, classN.Capacity); 
     if (classN.ToString().Contains("MacromediaFlashPlayerActiveX")) 
     { // continues below.... 
  1. 有了這些信息,您將擁有窗口的XY位置,您需要找到正確的XY來單擊屏幕上的按鈕。

    Thread.Sleep(2000); // this will allow any needed time to actually draw the flash on screen 
        Rectangle rect = new Rectangle(); 
        GetWindowRect(handle, ref rect); 
        var oldPos = Cursor.Position; 
        Point clientPoint = new Point(rect.X + 20, rect.Y + 10); // In this particular Flash Movie the Upload File button is 20 points from x and 10 points from Y) 
        if (rect.X != 0 && rect.Y != 0) 
        { 
         Cursor.Position = new Point(clientPoint.X, clientPoint.Y); 
        } 
    
  2. 發送一個單擊事件到這些座標

    mouse_event(MouseEventfLeftdown, 0, 0, 0, UIntPtr.Zero); 
        mouse_event(MouseEventfLeftup, 0, 0, 0, UIntPtr.Zero); 
        Thread.Sleep(2000); 
        // Options but "clean" return the mouse to it's original position 
        Cursor.Position = oldPos; 
    
  3. 一旦點擊已發送尋的類名#32770(至少IE)

    hwndTmp = (IntPtr)FindWindow("#32770", "Text of the upload window"); 
    
窗口

從這裏開始,繼續這個過程應該非常簡單。

我知道這不是最乾淨的解決方案(您需要一個登錄用戶,也有一個屏幕來獲取座標),但我知道有一種情況是有沒有替代這種情況和你需要爲它找到解決方案。

希望這會有所幫助。