[PYTHON] Python + Selenium을 사용하여 iframe을 선택하십시오.
PYTHONPython + 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.이것은 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.마침내 나를 위해 일한 것은 :
마침내 나를 위해 일한 것은 :
sel.run_script("$('#upload_file_frame').contents().find('img[alt=\"Humana\"]').click();")
기본적으로 셀레늄을 사용하여 iframe에서 링크를 찾아서 클릭하지 마십시오. jQuery를 사용하십시오. Selenium은 javascript의 임의의 부분을 실행할 수있는 기능을 가지고 있습니다 (이것은 python-selenium입니다. 원래 selenium 명령은 runScript 또는 그 밖의 것입니다). 일단 jQuery를 사용할 수 있으면 다음과 같이 할 수 있습니다. jQuery를 사용하여 iframe에서
-
==============================
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.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.Selenium의 selectFrame 명령은 css =와 같은 표준 로케이터를 모두 허용하지만 FRAME 및 IFRAME 요소와 함께 작동하는 별도의 로케이터 집합도 가지고 있습니다.
Selenium의 selectFrame 명령은 css =와 같은 표준 로케이터를 모두 허용하지만 FRAME 및 IFRAME 요소와 함께 작동하는 별도의 로케이터 집합도 가지고 있습니다.
의사가 말했듯이 :
일반적으로 특수 문맥을 사용하면 (예 : select_frame ( "relative = top"), select_frame ( "id = upload_file_frame")) 적절한 문맥을 설정하는 것이 좋습니다.
from https://stackoverflow.com/questions/7534622/select-iframe-using-python-selenium by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 사전 목록을 Dataframe으로 변환 (0) | 2018.10.02 |
---|---|
[PYTHON] 배열에 파이썬 csv 문자열 (0) | 2018.10.02 |
[PYTHON] 문자열에서 팬더 DataFrame 만들기 (0) | 2018.10.02 |
[PYTHON] Selenium : driver.quit ()를 호출하지 않고 geckodriver 프로세스가 PC 메모리에 영향을 미치지 않게하는 방법? (0) | 2018.10.02 |
[PYTHON] Pandas Series / DataFrame 전체를 멋지게 인쇄하십시오. (0) | 2018.10.02 |