2011-09-23 14 views
16

का उपयोग करते हुए एक आईफ्रेम का चयन करना तो, मैं पूरी तरह से परेशान था कि सेलेनियम में ऐसा कैसे किया जाए, और कहीं भी जवाब नहीं मिला, इसलिए मैं अपना अनुभव साझा कर रहा हूं।पायथन सेलेनियम

मैं एक आईफ्रेम चुनने की कोशिश कर रहा था और कोई भाग्य नहीं था (या फिर भी दोहराना नहीं)। एचटीएमएल इस तरह देखा:

@timed(650) 
def test_pedometer(self): 
    sel = self.selenium 
    ... 
    time.sleep(10) 
    for i in range(5): 
     try: 
      if sel.select_frame("css=#upload_file_frame"): break 
     except: pass 
     time.sleep(10) 
    else: self.fail("Cannot find upload_file_frame, the iframe for the device upload image buttons") 

दोहराया सेलेनियम आदेशों के हर संयोजन के साथ विफल रहता है:

<iframe id="upload_file_frame" width="100%" height="465px" frameborder="0" framemargin="0" name="upload_file_frame" src="/blah/import/"> 
<html> 
    <body> 
     <div class="import_devices"> 
      <div class="import_type"> 
       <a class="secondary_button" href="/blah/blah/?source=blah"> 
        <div class="import_choice_image"> 
         <img alt="blah" src="/public/images/blah/import/blah.png"> 
        </div> 
        <div class="import_choice_text">Blah Blah</div> 
       </a> 
      </div> 
     </div> 
    </body> 
</html> 

अजगर कोड (सेलेनियम लाइब्रेरी का उपयोग कर) इस का उपयोग करते हुए इस आइफ्रेम खोजने की कोशिश कर रहा था मैं खोज सकता हूँ। कभी-कभी सफलता पुनरुत्पादित नहीं होगी, तो शायद यह किसी प्रकार की दौड़ की स्थिति या कुछ थी? इसे सेलेनियम में उचित तरीके से प्राप्त करने का सही तरीका कभी नहीं मिला।

उत्तर

6

क्या अंत में मेरे लिए काम किया था:

 sel.run_script("$('#upload_file_frame').contents().find('img[alt=\"Humana\"]').click();") 

असल में, सेलेनियम का उपयोग नहीं करते iframe में लिंक मिल और उस पर क्लिक करने के लिए; jQuery का प्रयोग करें। सेलेनियम में स्पष्ट रूप से जावास्क्रिप्ट का एक मनमाना टुकड़ा चलाने की क्षमता है (यह पाइथन-सेलेनियम है, मैं अनुमान लगा रहा हूं कि मूल सेलेनियम कमांड रनस्क्रिप्ट या कुछ है), और एक बार जब मैं jQuery का उपयोग कर सकता हूं तो मैं ऐसा कुछ कर सकता हूं: Selecting a form which is in an iframe using jQuery

+3

आप सेलेनियम के getEval का उपयोग करना बेहतर होगा कमांड (शायद पाइथन बाइंडिंग में "get_eval") इसके रनस्क्रिप्ट कमांड के बजाए। प्राप्त करें जब तक जावास्क्रिप्ट कोड पूरा नहीं हो जाता है, जबकि रनस्क्रिप्ट सरल

1

सेलेनियम का चयनफ्रेम कमांड css= जैसे सभी मानक लोकेटर स्वीकार करता है, लेकिन इसमें विशेष रूप से फ्रेम और IFRAME तत्वों के साथ काम करने वाले locators का एक अतिरिक्त सेट भी है।

the doc के रूप में कहते हैं:

selectFrame (लोकेटर) वर्तमान विंडो के भीतर एक फ्रेम को चुनता है। (आप नेस्टेड फ्रेम का चयन करने के लिए कई बार इस कमांड का आह्वान कर सकते हैं।) पैरेंट फ्रेम का चयन करने के लिए, "सापेक्ष = पैरेंट" को लोकेटर के रूप में उपयोग करें; पर शीर्ष फ्रेम का चयन करें, "सापेक्ष = शीर्ष" का उपयोग करें। आप अपने 0-आधारित इंडेक्स नंबर से फ्रेम भी चुन सकते हैं; "index = 0", या "इंडेक्स = 2" के साथ तीसरा फ्रेम वाला पहला फ्रेम चुनें।

आप भी इस तरह फ्रेम आप सीधे चाहते हैं की पहचान करने, एक डोम अभिव्यक्ति का उपयोग कर सकते हैं: dom=frames["main"].frames["subframe"]

तर्क: लोकेटर - एक तत्व लोकेटर एक फ्रेम या iframe

सामान्य तौर पर पहचान करने के लिए, आप विशेष लोकेटर का उपयोग करके बेहतर भाग्य होगा, खासकर यदि आप सही संदर्भ पहले स्थापित करते हैं (उदाहरण, select_frame("relative=top"); select_frame("id=upload_file_frame");)।

+0

हाँ, selectFrame मेरे लिए काम नहीं किया। इसका मतलब यह नहीं है कि यह किसी के लिए काम नहीं करेगा, लेकिन मैंने इसे वास्तव में 5 में लगभग एक बार फ्रेम का चयन करने के लिए पाया। – rossdavidh

2

आपको जावास्क्रिप्ट एक्स्सेलर का उपयोग करने की आवश्यकता नहीं है। आपको बस इतना करना की जरूरत फ्रेम में स्विच था और फिर वापस बाहर स्विच, इसलिए जैसे:

// do stuff on main window 
switch_to_frame(frame_reference) 
// then do stuff in the frame 
driver.switch_to_default_content() 
// then do stuff on main window again 

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

28

यह मेरे लिए पाइथन (v।2.7), webdriver & सेलेनियम जब iframes के साथ परीक्षण और iframe के भीतर डेटा सम्मिलित करने का प्रयास:

self.driver = webdriver.Firefox() 

## Give time for iframe to load ## 
time.sleep(3) 
## You have to switch to the iframe like so: ## 
driver.switch_to_frame(driver.find_element_by_tag_name("iframe")) 
## Insert text via xpath ## 
elem = driver.find_element_by_xpath("/html/body/p") 
elem.send_keys("Lorem Ipsum") 
## Switch back to the "default content" (that is, out of the iframes) ## 
driver.switch_to_default_content() 
+1

किसी भी तरह वेबड्राइवर xpath के साथ खोज करते समय तत्वों को आईफ्रेम में पाता है। मैंने सीएसएस, आईडी द्वारा तत्वों को खोजने का प्रयास किया है, लेकिन यह हमेशा मुझे मौजूदा तत्व की त्रुटि नहीं देता है (वास्तव में टाइमआउट विफलता क्योंकि मैंने waitForElement कमांड का उपयोग किया था)। मैंने नहीं सोचा था कि एक्सपैथ द्वारा खोज तत्व अंतर करेगा, लेकिन जब मैंने विचारों से बाहर निकल रहा था तो सौभाग्य से मैंने कोशिश की। आपका बहुत बहुत धन्यवाद! – GOstrowsky

+5

'driver.switch_to_frame()' अब बहिष्कृत है, कृपया 'driver.switch_to.frame()' –

0

यहाँ एक काम ट्यूटोरियल जो आप को समझने के लिए अजगर के साथ सेलेनियम webdriver का उपयोग कर एक वेब पेज पर iframes को संभालने के लिए मदद है: https://www.youtube.com/watch?v=sfdWF4vBZ2o

यह आदेश iframes को संभालने के लिए प्रयोग किया जाता है: driver.switch_to.frame (frame_id)

2

तो iframe गतिशील नोड है, यह भी iframe appeare के लिए इंतजार करना संभव है nce स्पष्ट रूप से और फिर इसे ExpectedConditions उपयोग भी कर:

from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.support.ui import WebDriverWait as wait 

driver = webdriver.Chrome() 
driver.get(URL) 
wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it("iframe_name_or_id")) 

तो iframe@id या @name यह driver.find_element_by_xpath(), driver.find_element_by_tag_name(), आदि का उपयोग आम WebElement के रूप में पाया जा सकता है नहीं है ..:

wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(driver.find_element_by_xpath("//iframe[@class='iframe_class']"))) 

करने के लिए iframe से वापस स्विच करें:

driver.switch_to.default_content() 
संबंधित मुद्दे