2012-09-12 21 views
9

के साथ ड्रॉपडाउन तत्व मेनू पर क्लिक करें, मैं एक प्रशासनिक कार्य स्वचालित करने की कोशिश कर रहा हूं, अब तक मैंने ड्रॉप डाउन मेनू दिखाने के लिए तत्व पर क्लिक करने के लिए सेलेनियम बनाया है।सेलेनियम वेबड्राइवर

enter image description here

यह समय उन मेनू तत्वों मैं कह रही है कि तत्व प्रदर्शित किया जाना चाहिए एक त्रुटि मिल गया है में से एक पर क्लिक करने के लिए आता है।

कोड:

driver = webdriver.Chrome() 
driver.implicitly_wait(10) 
driver.get(url) 
doc = driver.find_element_by_css_selector('td.ms-vb-title > table') 
try: 
    doc.click() 
    time.sleep(4) 
    menu = driver.find_element_by_xpath('//menu/span[5]') 
    time.sleep(4) 
    print dir(menu) 
    menu.click() 
except: 
    traceback.print_exc() 
    driver.quit() 

त्रुटि:

Traceback (most recent call last): 
    File "aprobar_docs.py", line 22, in main 
    menu.click() 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", 
line 52, in click 
    self._execute(Command.CLICK_ELEMENT) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webelement.py", 
line 205, in _execute 
    return self._parent.execute(command, params) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", l 
ine 156, in execute 
    self.error_handler.check_response(response) 
    File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py" 
, line 147, in check_response 
    raise exception_class(message, screen, stacktrace) 
ElementNotVisibleException: Message: u'Element must be displayed to click' 

कोड एक बहुत इंतजार कर रहा है के रूप में आप देख सकते हैं तत्व लोड करने के लिए। मैंने तत्व की is_displayed संपत्ति True पर सेट करने का भी प्रयास किया है लेकिन न तो काम नहीं किया है।

नोट:

menu चर नहीं है: तत्व यह है कि दिखाई नहीं देता है xpath खोज पर एक है, यह मौजूद है, क्योंकि मैं dir (मेनू) के साथ यह प्रवेश करने के बाद

संपादित है मेनू स्वयं ही स्पैन में से एक है जो मेनू के तत्व हैं, docPerfil एचटीएमएल तत्व ड्रॉपडाउन दिखाने के लिए क्लिक किया जा रहा है।

संपादित करें 2:

, क्रोम उपकरण पर डोम निरीक्षण जब आप एक doc एक नया मेनू पेड़ पर बनाया जाता है, मैं अगर यह एक ajax कॉल या वेनिला js की वजह से नहीं जानता क्लिक करें, मुझे नहीं लगता कि यह वास्तव में महत्वपूर्ण है कि यह कैसे बनाया गया है। मैं इसे पृष्ठ से पुनर्प्राप्त नहीं कर सकता और इससे एक अजगर वस्तु बना सकता हूं, यह कम से कम कोड पर प्रदर्शित नहीं किया जा रहा है।

अंतिम संपादित करें:

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

+1

आप 'menu' तत्व देखने के दोनों किनारों पर क्यों सो रहे हैं?यदि पृष्ठ तत्व पुनर्प्राप्त करते समय तत्व दिखाई नहीं देता है, तो वेबड्राइवर इसे क्लिक करने में सक्षम नहीं होगा, चाहे आप कितनी देर प्रतीक्षा करें। –

+0

@ sr2222 जब आप driver.get() को कॉल करते हैं तो पृष्ठ पुनर्प्राप्त किया जाता है, स्क्रीन पर ड्रॉपडाउन प्रदर्शित होता है और जब आप doc.click() करते हैं तो डोम पेड़ पर मौजूद होते हैं, मैंने ड्रॉपडाउन मेनू को लोड नहीं होने की संभावना को समाप्त कर दिया जैसे ही कोड निष्पादित किया जाता है। मेनू तत्व कम से कम मनुष्यों के लिए मौजूद और दृश्यमान है, मैं इसकी गारंटी दे सकता हूं। – loki

+0

मेनू को प्रदर्शित करने के लिए क्लिक करने और प्रतीक्षा करने के बाद फिर से 'डॉक्टर' निकालने का प्रयास करें, और वस्तुओं के 'id' विशेषता को पहले और बाद में तुलना करें। मुझे एक छेड़छाड़ संदेह है कि सेलेनियम सर्वर वास्तव में आपके दूसरे तत्व निष्कर्षण पर एक कैश किए गए कमजोर वस्तु का संदर्भ दे रहा है (चूंकि आपकी क्लिक कार्रवाई पृष्ठ लोड ईवेंट को ट्रिगर नहीं करती है, पेज ऑब्जेक्ट बासी नहीं जाती है)। –

उत्तर

8

क्यों अपने क्लिक अपनी सूची में करने के लिए एक ajax कॉल फायरिंग नहीं है, तो आप इस

el = driver.find_element_by_id('id_of_select') 
for option in el.find_elements_by_tag_name('option'): 
    if option.text == 'The Options I Am Looking For': 
     option.click() # select() in earlier versions of webdriver 

जैसा कोई विकल्प चुनें नहीं है, आप वास्तव में क्लिक पर अमल करने की जरूरत नहीं है।

+0

@ नीलेश शर्मा मैंने इस दृष्टिकोण का उपयोग किया लेकिन मुझे एक त्रुटि मिल रही है कि वेब तत्व ऑब्जेक्ट पुनरावर्तनीय नहीं है। अगर आप लूप में इसे फिर से चालू कर रहे हैं तो यह – abhi

+0

@abhi नहीं है क्या आप निश्चित रूप से find_elementSSSSS_by_tag_name() का उपयोग कर रहे हैं? (बस यह सुनिश्चित करने के लिए कि आपने देखा कि हे हे) –

0

आपको लक्ष्य का लिंक ढूंढना होगा। आप वास्तव में तत्व क्लिक करें, आप लिंक पर क्लिक करें ... (या इसके बजाय, आप उनके अंदर लिंक वाले तत्वों पर क्लिक करें)। ऐसा कहा जा रहा है कि लिंक पर क्लिक करने का सबसे निश्चित अग्नि तरीका लिंक तत्व को अलग करना है।

frame = driver.find_element_by_id('this_is_your_frame_name') 
links = frame.find_elements_by_xpath('.//a') 
links[1].click() 

या वैकल्पिक रूप से,

for link in links: 
    if link.text() == "Administratar Permisos": 
     link.click() 
संबंधित मुद्दे