2012-07-17 16 views
8

मैं पूरी ब्राउज़र स्क्रीन के स्क्रीनशॉट लेने कोशिश कर रहा हूँ (जैसे किसी भी उपकरण पट्टियों, पैनलों और इतने पर के साथ) न केवल एक पूरे पेज, तो मैं यह मिल गया हूँ कोड:सेलेनियम webdriver के वर्तमान विंडो GUID से विंडो हैंडल (IntPtr) जाओ

using (FirefoxDriver driver = new FirefoxDriver()) 
{ 
    driver.Navigate().GoToUrl(url); 

    string title = String.Format("{0} - Mozilla Firefox", driver.Title); 
    var process = Process.GetProcesses() 
     .FirstOrDefault(x => x.MainWindowTitle == title); 

    if (process != null) 
    { 
     var screenCapture = new ScreenCapture(); 
     var image = screenCapture.CaptureWindow(process.MainWindowHandle); 
     // ... 
    } 
} 

निश्चित रूप से इसका मतलब यह है कि आप उस विशिष्ट शीर्षक के साथ एकल ब्राउज़र उदाहरण है:

using (FirefoxDriver driver = new FirefoxDriver()) 
{ 
    driver.Navigate().GoToUrl(url);     

    ScreenCapture sc = new ScreenCapture(); 

    // How can I find natural IntPtr handle of window here, using GUID-like identifier returning by driver.currentWindowHandle? 
    Image img = sc.CaptureWindow(...); 
    MemoryStream ms = new MemoryStream(); 
    img.Save(ms, ImageFormat.Jpeg); 
    return new FileStreamResult(ms, "image/jpeg"); 
} 

उत्तर

3

आप विंडो हैंडल Process.GetProcesses का उपयोग कर मिल सकता है।

+0

अच्छा चाल, btw, लेकिन दो देखते हैं कि अलग-अलग पर पूरा काम कर समाधान (सी #) सामने ब्राउज़र लाने के लिए किया जाता है पोस्ट करने के लिए, एक ही शीर्षक के साथ फ़ायरफ़ॉक्स के उदाहरण? – kseen

+0

@kseen आप बदल सकते [ 'FirstOrDefault'] (http://msdn.microsoft.com/en-us/library/bb549039) [' SingleOrDefault'] के साथ (http://msdn.microsoft.com/en-us/लाइब्रेरी/बीबी 549274), ताकि यदि एक ही शीर्षक के साथ दो अलग-अलग ब्राउज़र इरादे हैं तो आपको अपवाद मिलेगा। यदि आप एक परीक्षण मामले में हैं तो आप इसे जोर दे सकते हैं। –

+0

@PaoloMoretti मैं कैसे वर्तमान विंडो (मौजूदा विंडो जो मैन्युअल रूप से खोला जाता है) को संभाल प्राप्त कर सकते हैं जो ड्राइवर द्वारा खोला नहीं है मैं driver.getWindowHandle() का उपयोग नहीं कर सकते हैं मतलब है, –

2

बस और हैक के लिए विचार। फ़ायरफ़ॉक्स उदाहरण की प्रक्रिया प्राप्त करने के लिए आप प्रतिबिंब विधियों का उपयोग कर सकते हैं। - पहले FirefoxDriverEx वर्ग FirefoxDriver से विरासत में मिली घोषित जो प्रक्रिया उदाहरण समाहित पहुँच बाइनरी संपत्ति की रक्षा की है:

class FirefoxDriverEx : FirefoxDriver { 
     public Process GetFirefoxProcess() { 
      var fi = typeof(FirefoxBinary).GetField("process", BindingFlags.NonPublic | BindingFlags.Instance); 
      return fi.GetValue(this.Binary) as Process; 
     } 
    } 

से आप बॉक्स से बाहर MainWindowHandle संपत्ति

using (var driver = new FirefoxDriverEx()) { 
      driver.Navigate().GoToUrl(url); 

      var process = driver.GetFirefoxProcess(); 
      if (process != null) { 
       var screenCapture = new ScreenCapture(); 
       var image = screenCapture.CaptureWindow(process.MainWindowHandle); 
       // ... 
      } 
     } 
+0

क्या आप फ़ायरफ़ॉक्स ब्राउज़र के अलावा अन्य विंडो ढूंढने के लिए अन्य विधियां जोड़ सकते हैं, उदा। सेलेनियम में आईई, क्रोम, सफारी? मुद्दा यह है कि मुझे 'फ़ायरफ़ॉक्सिनरी 'या कुछ और' फ़ायरफ़ॉक्स बाइनरी 'जैसे कुछ नहीं मिल रहा है। – kseen

+0

यह विधि आईई या क्रोम के लिए उपयुक्त नहीं है क्योंकि उन मामलों में ब्राउज़र की प्रक्रियाएं बाहरी सेलेनियम सेवाओं जैसे IEDriverServer.exe और chromedriver.exe द्वारा नियंत्रित होती हैं। यह विधि बस हैक और 'जैसा है' काम कर रही है। कार्य करने की विधि खोजने के लिए आप सेलेनियम ड्राइवर के स्रोतों को देख सकते हैं और शायद अपने स्वयं के संस्करण बना सकते हैं। – necrostaz

+0

तो, ब्राउज़र विंडो के हैंडल प्राप्त करने के लिए केवल एक रोबूट विधि मौजूद है और यह खिड़की के आंशिक शीर्षक से WinAPI का उपयोग कर एक विंडो ढूंढ रही है? – kseen

0

के लिए उपयोग के लिए प्रक्रिया उदाहरण मिल सकता है, सेलेनियम नहीं है ड्राइवर प्रक्रिया आईडी या ब्राउज़र hwnd का पर्दाफाश करें लेकिन यह संभव है। नीचे तर्क मिल hwnd

  • जब चालक आरंभ नहीं हो जाता, हब के लिए यूआरएल हो और पोर्ट संख्या
  • निकालने पोर्ट नंबर से, प्रक्रिया आईडी जो सुनने के लिए इस बंदरगाह का उपयोग कर रहा है, यानी मिल रहा है। चालक की पीआईडी ​​
  • नेविगेशन के बाद, iexplore के सभी उदाहरणों से माता-पिता पीआईडी ​​चालक की पीआईडी ​​से मेल खाता है, यानी ब्राउज़र पीआईडी ​​पाते हैं।
  • ब्राउज़र की HWND pid एक बार ब्राउज़र hwnd पाया जाता है, तो आप को अग्रभाग में सेलेनियम लाने के लिए Win32 एपीआई का उपयोग कर सकते हैं।

संभव नहीं है पूर्ण कोड यहाँ मेरे ब्लॉग

http://www.pixytech.com/rajnish/2016/09/selenium-webdriver-get-browser-hwnd/

संबंधित मुद्दे