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) 예, 저는 항상 두 가지 이유로 텍스트를 사용하지 않고 요소를 식별하려고합니다.
- 텍스트가 변경 될 가능성이 더 높습니다.
- 중요한 경우 현지화 된 빌드에 대해 테스트를 실행할 수 없습니다.
솔루션 중 하나 :
- xpath를 사용하여 ID 또는 다른 고유 식별자가있는 상위 또는 상위 요소를 찾은 다음 또는 일치하는 하위 / 하위 요소를 찾을 수 있습니다.
- 링크 자체에 대한 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
'developer tip' 카테고리의 다른 글
데이터 바인딩을 사용하여보기 가시성 설정 (0) | 2021.01.09 |
---|---|
WPF : UserControl에서 표시하는 대화 상자의 소유자 창을 어떻게 설정합니까? (0) | 2021.01.09 |
C ++ (확장)의 WINMAIN 및 main () (0) | 2021.01.09 |
특별한 경우로 빈 문자열? (0) | 2021.01.08 |
PHP에서 이미지 조각을 사용하여 모양을 그리는 방법 (0) | 2021.01.08 |