복붙노트

[PYTHON] Python + Selenium을 사용하여 iframe을 선택하십시오.

PYTHON

Python + Selenium을 사용하여 iframe을 선택하십시오.

그래서 저는 Selenium에서 이것을 어떻게하는지에 대해 절대적으로 당혹 스러웠습니다. 그리고 어디에서나 답을 찾을 수 없었기 때문에 제 경험을 공유하고 있습니다.

나는 iframe을 선택하고 행운이 없거나 반복적으로 어쨌든하지 않으려 고 노력했다. HTML은 다음과 같이 보입니다.

<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>

셀레늄 라이브러리를 사용하는 Python 코드는 다음을 사용하여이 iframe을 찾으려고했습니다.

    @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")

내가 찾을 수있는 셀렌 명령의 모든 조합과 함께 반복 실패. 가끔 성공은 재현 할 수 없기 때문에 아마도 일종의 경쟁 조건이었을 것입니다. 적절한 셀레늄으로 얻는 방법을 찾지 못했습니다.

해결법

  1. ==============================

    1.이것은 iframe으로 테스트하고 iframe 내에 데이터를 삽입하려고 할 때 Python (2.7 절), webdriver 및 Selenium에서 저에게 효과적이었습니다.

    이것은 iframe으로 테스트하고 iframe 내에 데이터를 삽입하려고 할 때 Python (2.7 절), webdriver 및 Selenium에서 저에게 효과적이었습니다.

    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()
    
  2. ==============================

    2.마침내 나를 위해 일한 것은 :

    마침내 나를 위해 일한 것은 :

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

    기본적으로 셀레늄을 사용하여 iframe에서 링크를 찾아서 클릭하지 마십시오. jQuery를 사용하십시오. Selenium은 javascript의 임의의 부분을 실행할 수있는 기능을 가지고 있습니다 (이것은 python-selenium입니다. 원래 selenium 명령은 runScript 또는 그 밖의 것입니다). 일단 jQuery를 사용할 수 있으면 다음과 같이 할 수 있습니다. jQuery를 사용하여 iframe에서

  3. ==============================

    3.iframe이 동적 노드 인 경우 iframe을 명시 적으로 기다린 다음 ExpectedConditions를 사용하여 전환 할 수도 있습니다.

    iframe이 동적 노드 인 경우 iframe을 명시 적으로 기다린 다음 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()
    
  4. ==============================

    4.JavascriptExecutor를 사용할 필요가 없습니다. 필요한 작업은 프레임으로 전환 한 다음 다시 전환하는 것입니다.

    JavascriptExecutor를 사용할 필요가 없습니다. 필요한 작업은 프레임으로 전환 한 다음 다시 전환하는 것입니다.

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

    당신이 이것을 조심해야하는 한 결코 문제가 없을 것입니다. 내가 항상 JavascriptExecutor를 사용하는 유일한 경우는 자바를 사용하는 것이이 경우보다 안정적이라고 생각하기 때문에 창 포커스를 얻는 것입니다.

  5. ==============================

    5.Selenium의 selectFrame 명령은 css =와 같은 표준 로케이터를 모두 허용하지만 FRAME 및 IFRAME 요소와 함께 작동하는 별도의 로케이터 집합도 가지고 있습니다.

    Selenium의 selectFrame 명령은 css =와 같은 표준 로케이터를 모두 허용하지만 FRAME 및 IFRAME 요소와 함께 작동하는 별도의 로케이터 집합도 가지고 있습니다.

    의사가 말했듯이 :

    일반적으로 특수 문맥을 사용하면 (예 : select_frame ( "relative = top"), select_frame ( "id = upload_file_frame")) 적절한 문맥을 설정하는 것이 좋습니다.

  6. from https://stackoverflow.com/questions/7534622/select-iframe-using-python-selenium by cc-by-sa and MIT license