developer tip

Python Selenium으로 요소가 존재하는지 확인

copycodes 2021. 1. 9. 10:12
반응형

Python Selenium으로 요소가 존재하는지 확인


문제가 있습니다. 셀레늄 (firefox) 웹 드라이버를 사용하여 웹 페이지를 열고 몇 개의 링크를 클릭 한 다음 스크린 샷을 캡처하고 있습니다.

내 스크립트는 CLI에서 잘 실행되지만 cronjob을 통해 실행하면 첫 번째 find_element () 테스트를 통과하지 못합니다. 디버그 또는 실패 이유를 파악하는 데 도움이되는 내용을 추가해야합니다.

기본적으로 로그인 페이지로 이동하기 전에 '로그인'앵커를 클릭해야합니다. 요소의 구성은 다음과 같습니다.

<a class="lnk" rel="nofollow" href="/login.jsp?destination=/secure/Dash.jspa">log in</a>

find_element By LINK_TEXT 메서드를 사용하고 있습니다.

login = driver.find_element(By.LINK_TEXT, "log in").click()

나는 약간의 파이썬 멍청이이기 때문에 언어와 약간 싸우고 있습니다 ...

A) 링크가 실제로 파이썬에 의해 선택되고 있는지 어떻게 확인합니까? try / catch 블록을 사용해야합니까?

B) LINK_TEXT보다 DOM 요소를 찾는 더 나은 / 더 신뢰할 수있는 방법이 있습니까? 예를 들어 JQuery에서 더 구체적인 선택기 $ ( 'a.lnk : contains (log in)'). do_something ();을 사용할 수 있습니다.


나는 주요 문제를 해결했으며 손가락 문제였습니다.-잘못된 매개 변수로 스크립트를 호출했습니다-간단한 실수.

요소가 존재하는지 확인하는 방법에 대한 몇 가지 지침이 필요합니다. 또한 엉뚱한 time.sleep () 호출을 사용하는 대신 암시 적 / 명시 적 대기의 예제 / 설명.

건배, ns


A) 네. 요소가 존재하는지 확인하는 가장 쉬운 방법은 단순히 find_element내부 를 호출 하는 것 try/catch입니다.

B) 예, 저는 항상 두 가지 이유로 텍스트를 사용하지 않고 요소를 식별하려고합니다.

  1. 텍스트가 변경 될 가능성이 더 높습니다.
  2. 중요한 경우 현지화 된 빌드에 대해 테스트를 실행할 수 없습니다.

솔루션 중 하나 :

  1. xpath를 사용하여 ID 또는 다른 고유 식별자가있는 상위 또는 상위 요소를 찾은 다음 또는 일치하는 하위 / 하위 요소를 찾을 수 있습니다.
  2. 링크 자체에 대한 ID, 이름 또는 기타 고유 식별자를 요청할 수 있습니다.

후속 질문의 경우 사용 try/catch은 요소가 있는지 여부를 알 수있는 방법이며 대기의 좋은 예는 http://seleniumhq.org/docs/04_webdriver_advanced.html 에서 찾을 수 있습니다 .


ㅏ)

from selenium.common.exceptions import NoSuchElementException        
def check_exists_by_xpath(xpath):
    try:
        webdriver.find_element_by_xpath(xpath)
    except NoSuchElementException:
        return False
    return True

b) 사용 xpath-가장 신뢰할 수 있습니다. 또한 모든 스크립트에서 xpath를 표준으로 사용하고 위에서 언급 한 범용 사용을 위해 함수를 만들 수 있습니다.

업데이트 : 나는 4 년 전에 초기 답변을 썼고 당시 xpath가 최선의 선택이라고 생각했습니다. 이제 css 선택기 를 사용하는 것이 좋습니다 . 나는 여전히 "ID 별", "이름 별"등을 혼합 / 사용하지 않고 대신 하나의 단일 접근 방식을 사용하는 것이 좋습니다.


제공된 솔루션 중 어느 것도 나에게 가장 쉬운 것 같지 않았으므로 나만의 방식을 추가하고 싶습니다.

기본적으로 요소 대신 요소 목록을 얻은 다음 결과를 계산합니다. 0이면 존재하지 않습니다. 예:

if driver.find_elements_by_css_selector('#element'):
    print "Element exists"

find_elements_by_css_selector셀 수 있는지 확인하기 위해 "s"를 확인합니다.

편집 : 나는 len(목록 을 확인하고 있었지만 최근에 빈 목록이 거짓이라는 것을 배웠으므로 목록의 길이를 전혀 가져올 필요가 없으며 더 간단한 코드를 남길 필요가 없습니다.

Also, another answer says that using xpath is more reliable, which is just not true. See What is the difference between css-selector & Xpath? which is better(according to performance & for cross browser testing)?


Solution without try&catch and without new imports:

if len(driver.find_elements_by_id('blah')) > 0: #pay attention: find_element*s*
    driver.find_element_by_id('blah').click #pay attention: find_element

The same as Brian, but add to this answer from tstempko:

https://sqa.stackexchange.com/questions/3481/quicker-way-to-assert-that-an-element-does-not-exist

So I tried and it works quickly:

driver.implicitly_wait(0)

if driver.find_element_by_id("show_reflist"):        
 driver.find_element_by_id("show_reflist").find_element_by_tag_name("img").click()

after this I restore my default value

driver.implicitly_wait(30)

You could also do it more concisely using

driver.find_element_by_id("some_id").size() != 0

driver.find_element_by_id("some_id").size() is class method.

What we need is :

driver.find_element_by_id("some_id").size which is dictionary so :

if driver.find_element_by_id("some_id").size['width'] != 0 : print 'button exist'

ReferenceURL : https://stackoverflow.com/questions/9567069/checking-if-element-exists-with-python-selenium

반응형