2012-03-16 14 views
25

जब मैं फ़ायरफ़ॉक्स ड्रायवर जैसे वेबड्राइवर में प्रॉक्सी का उपयोग कर रहा हूं, यदि प्रॉक्सी खराब है तो प्राप्त विधि हमेशा के लिए अवरुद्ध हो जाएगी। मैंने कुछ टाइमआउट पैरामीटर सेट किए हैं, लेकिन यह काम नहीं कर सका।मैं सेलेनियम वेबड्राइवर को टाइमआउट कैसे प्राप्त करूं?

यह मेरा कोड है:

FirefoxProfile profile = new FirefoxProfile(); 
profile.setPreference("general.useragent.override", ua);  
Proxy p = new Proxy(); 
p.setHttpProxy(proxy); 
profile.setProxyPreferences(p); 
profile.setEnableNativeEvents(true); 

// create a driver 
WebDriver driver = new FirefoxDriver(profile); 
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS); 
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS); 
driver.get("www.sina.com.cn") 

कॉल driver.get को हमेशा के लिए अवरुद्ध कर देगा, लेकिन मैं इसे 30 सेकंड के लिए प्रतीक्षा करने के लिए और अगर पेज लोड नहीं है तो एक अपवाद फेंक चाहते हैं।

उत्तर

18

इस प्रयास करें:

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
+3

जैसा कि मैंने लिखा है, यह उत्तर सही के रूप में स्वीकार किया जाता है। हालांकि, झोंगिंग [नीचे उल्लिखित] के रूप में (http://stackoverflow.com/a/10827070/705157), यह समाधान लोड को बहुत लंबे समय तक अवरुद्ध करता है। मुझे लगता है कि वास्तविक उत्तर [उपयोगकर्ता 1102631] होना चाहिए (http://stackoverflow.com/a/12915015/705157)। –

+0

सहमत हैं, यह उत्तर सेलेनियम चलाए जाने वाले प्रत्येक आदेश में 30 सेकंड की देरी जोड़ देगा। इस तरह मनमाने ढंग से देरी परीक्षण करने के लिए एक बहुत महंगा और आम तौर पर अविश्वसनीय तरीका है। आमतौर पर 0 तक अंतर्निहित प्रतीक्षा सेट करना और प्रत्येक क्रिया के परिणामों के लिए स्पष्ट प्रतीक्षा करना बेहतर होता है। यह अधिक भरोसेमंद और आम तौर पर तेज़ है क्योंकि आप केवल तब तक प्रतीक्षा करते हैं जब तक कि पूर्णकालिक सीमा के बजाय कार्रवाई न हो जाए। – ajsutton

+0

@ajsutton आप स्पष्ट रूप से कैसे प्रतीक्षा करते हैं? – Thufir

2

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 

कुछ नहीं करेंगे जोड़ें। पृष्ठ बहुत लंबे समय तक अवरुद्ध होगा।

21

timeouts() कुछ ड्राइवरों में विधियों को लागू नहीं किया गया है और सामान्य रूप से बहुत अविश्वसनीय हैं।
मैं (धागा नाम के रूप में उपयोग करने के लिए यूआरएल गुजर) समय समाप्ति के लिए एक अलग थ्रेड का उपयोग करें:

Thread t = new Thread(new Runnable() 
    { 
     public void run() 
     { 
     driver.get(Thread.currentThread().getName()); 
     } 
    }, url); 
    t.start(); 
    try 
    { 
     t.join(YOUR_TIMEOUT_HERE_IN_MS); 
    } 
    catch (InterruptedException e) 
    { // ignore 
    } 
    if (t.isAlive()) 
    { // Thread still alive, we need to abort 
     logger.warning("Timeout on loading page " + url); 
     t.interrupt(); 
    } 

इस समय के सबसे अधिक काम करने के लिए लगता है, लेकिन यह हो सकता है कि चालक वास्तव में अटक और किसी भी है ड्राइवर को बाद में कॉल अवरुद्ध कर दिया जाएगा (मुझे लगता है कि विंडोज़ पर क्रोम ड्राइवर के साथ)। ड्राइवर के रूप में निर्दोष कुछ भी। FindElements() कॉल अवरुद्ध हो सकता है। दुर्भाग्य से मेरे पास अवरुद्ध ड्राइवरों के लिए कोई समाधान नहीं है।

+1

यदि आप उपयोगकर्ता स्क्रिप्ट के साथ सेलेनियम मिश्रण करते हैं (एक्सटेंशन के माध्यम से और प्रोफाइल को वापस सहेजते हैं) तो आप अभी भी ब्राउज़र में जावास्क्रिप्ट कोड को आग लगा सकते हैं, भले ही सेलेनियम लोड के लिए प्रतीक्षा कर रहा हो।इस तरह आप एक साधारण जावास्क्रिप्ट 'सेटटाइमआउट (फ़ंक्शन() {window.stop();}, 5000) जोड़ सकते हैं' एमएस में वांछित समय के साथ पेज लोड होने से रोकें। एक बार जब आप लोड करना बंद कर देते हैं, तो नियंत्रण को सेलेनियम पर वापस भेज दिया जाता है (सरल परीक्षण चलाएं, फिर लोड होने पर ईएससी कुंजी दबाएं)। इस तरह से आप केवल 5 सेकंड वेबपृष्ठ लोड कर सकते हैं और आम वेब तत्व प्राप्त कर सकते हैं। – erm3nda

4

मुझे एक ही समस्या थी और इस मंच के लिए धन्यवाद और कुछ अन्य को जवाब मिला। प्रारंभ में मैंने अलग धागे के बारे में भी सोचा लेकिन यह कोड को थोड़ा सा जटिल करता है। इसलिए मैंने एक ऐसा जवाब खोजने की कोशिश की जो मेरे सिद्धांत "लालित्य और सादगी" के साथ संरेखित हो।

कृपया इस तरह के मंच पर एक नजर है: https://sqa.stackexchange.com/questions/2606/what-is-seleniums-default-timeout-for-page-loading

#

समाधान: कोड में, 'प्राप्त' विधि के साथ लाइन इससे पहले कि आप उदाहरण के लिए उपयोग कर सकते हैं:

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS); 
#

एक बात यह है कि यह टाइमआउट अपवाद को फेंक देता है ताकि आपको इसे पकड़ने की कोशिश करें या किसी विधि में लपेटें।

मुझे पेज लोडटाइमआउट के लिए गेटटर नहीं मिला है, इसलिए मुझे नहीं पता कि डिफ़ॉल्ट मान क्या है, लेकिन शायद बहुत अधिक है क्योंकि मेरी स्क्रिप्ट कई घंटों तक जमे हुए थी और कुछ भी आगे नहीं बढ़ गया।

#

नोटिस: 'pageLoadTimeout' क्रोम ड्राइवर के लिए लागू नहीं है और इस तरह अपवाद का कारण बनता है। मैंने उपयोगकर्ताओं द्वारा टिप्पणियों को देखा कि इसे बनाने की योजना है।

1

driver.manage()। Timeouts() .3LoadTimeout (10, TimeUnit.SECONDS) का समाधान सिंक लोडिंग वाले पृष्ठों पर काम करेगा, लेकिन यह एसिंच में सामान लोड करने वाले पृष्ठों पर समस्या का समाधान नहीं करता है, अगर हम पेज लोडटाइम आउट सेट करते हैं तो परीक्षण हर समय असफल हो जाएंगे।

0

मुझे लगता है कि समय समाप्ति कॉल विशेष रूप से इंटरनेट एक्सप्लोरर के लिए, वास्तविक जीवन में काफी विश्वसनीय नहीं हैं, हालांकि निम्न समाधानों मदद की हो सकती है:

  1. आप @Test का उपयोग करके पूरा परीक्षण का समय-समाप्त कर सकते हैं (टाइमआउट = 10000) जूनिट परीक्षण में आप सेलेनियम प्रक्रिया चला रहे हैं। यह पूरे शो को अवरुद्ध करने के बजाय, अन्य परीक्षणों को निष्पादित करने के लिए मुख्य धागे को मुक्त कर देगा। हालांकि यह कभी-कभी काम नहीं करता है।

  2. वैसे भी आप समय के साथ परीक्षण मामले को बचाने का इरादा नहीं रखते हैं, क्योंकि एक भी ऑपरेशन का समय समाप्त करने से असंगत स्थिति में पूरे परीक्षण अनुक्रम को छोड़ दिया जा सकता है। आप बस बिना किसी अवरोध के अन्य टेस्टकेस के साथ आगे बढ़ना चाहते हैं (या शायद उसी परीक्षण को फिर से प्रयास करें)। ऐसे मामले में एक मूर्ख-सबूत विधि एक परामर्शदाता को लिखना होगा जो वेबड्राइवर की प्रक्रियाओं की प्रक्रिया करता है (उदाहरण के लिए IEDriverServer.exe, Phantomjs.exe) 10 मिनट से अधिक के लिए चल रहा है और उन्हें मार डालो। एक उदाहरण Automatically identify (and kill) processes with long processing time

8

पर पाया जा सकता है

driver.executeScript("window.location.href='http://www.sina.com.cn'")

कोशिश इस बयान तुरंत वापस आ जाएगी।

और इसके बाद, आप वेबड्राइवरवेट को समय-समय पर यह जांचने के लिए जोड़ सकते हैं कि पेज शीर्षक या कोई तत्व ठीक है या नहीं।

आशा है कि यह आपकी मदद करेगा।

+2

यह ChromeDriver का उपयोग करके मेरे लिए सबसे आसान कामकाजी समाधान था, क्योंकि यह पेज लोडटाइम सामग्री का समर्थन नहीं करता है। पायथन में भी काम करता है (execute_script)। – chris838

+1

अच्छा! Socket.timeout अपवादों (पायथन) के खिलाफ मेरी लड़ाई को हल करने का शानदार तरीका। मैं सेलेनियम के टाइमआउट अपवाद से निपटना पसंद करता हूं। –

2

आप इस

int connectionTimeout=5000; 
int socketTimeout=15000; 
ApacheHttpClient.Factory clientFactory = new ApacheHttpClient.Factory(new HttpClientFactory(connectionTimeout, socketTimeout)); 
HttpCommandExecutor executor = 
     new HttpCommandExecutor(new HashMap<String, CommandInfo>(), new URL(seleniumServerUrl), clientFactory); 
RemoteWebDriver driver = new RemoteWebDriver(executor, capabilities); 
0

एक कोशिश पकड़ में इसी तरह की स्थिति

driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS); 

और एम्बेडेड driver.get कोड में कोड नीचे प्रयुक्त है, जो समस्या हल हो जाती है जैसे HTTP क्लाइंट पर टाइमआउट सेट कर सकते हैं उन पृष्ठों को लोड करने के लिए जो 1 मिनट से अधिक समय ले रहे थे।

+1

अपने उत्तर में कुछ स्पष्टीकरण जोड़ें – mumair

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