2011-04-18 3 views
2

저는 Python과 함께 Selenium 2/Webdriver를 사용하고 있는데, 문자열로 시작하는 첫 번째 링크를 클릭하고 싶습니다. 여기에 나온 코드는 다음과 같습니다.부분 텍스트 일치를 기반으로 링크를 클릭하십시오.

def click_link_partial(div_id, partial): 
    linkdiv = driver.find_element_by_id(div_id) 
    z = (a.click() for a in linkdiv.find_elements_by_tag_name('a') if a.text.startswith(partial)) 
    z.next() 

저는 파이썬의 생성기에 익숙하지 않습니다. 왜 z.next()가 실행될 때가 아니라 즉시 a.click()이 호출되지 않습니까?

이 코드를 사용하면 어떤 단점이 있습니까?

답변

2

먼저 파이썬 생성기에 익숙해 지십시오. 파이썬 생성기에서 매우 강력한 도구입니다. Thomas Wouters의 위대한 설명은 다른 질문을 읽어 보면 알 수 있습니다. What can you use Python generator functions for?

일단 읽고 나면 발전기를 통해 느리게 표현식을 평가할 수 있습니다.

위의 코드에이 정보를 연결하면 생성 한 생성기 표현식을 반복 할 것으로 예상되므로 a.click()이 실제로 실행되지 않습니다. 따라서 click() 메서드를 실제로 호출하려면 z.next()을 실행해야합니다.

def click_link_partial(div_id, partial): 
    linkdiv = driver.find_element_by_id(div_id) 
    for a in linkdiv.find_elements_by_tag_name('a'): 
     if a.text.startswith(partial): 
     a.click() 
     break # stop iterating over the partially matched elements. 

을 그러나 당신이 원하는 경우 : 당신이 z.next()을 발행하려면, 당신은 단지 첫 번째 부분적으로 일치하는 링크를 클릭합니다 가정하지 않을 경우 다음과 같이

, 당신은 위의 코드를 다시 작성합니다 부분적으로 연결된 모든 요소를 ​​클릭하려면 위에 나온 코드에서 z.next()을 제거하고 외부 함수/메서드에서 사용되는 생성자 식을 반환해야합니다. 다음은 예입니다.

def click_link_partial(div_id, partial): 
    linkdiv = driver.find_element_by_id(div_id) 
    return (a for a in linkdiv.find_elements_by_tag_name('a') 
      if a.text.startswith(partial)) 

for matched_clickable_anchor in click_link_partial('#some-div-id', 'spam'): 
    matched_clickable_anchor.click() # do click 
    # do something else. 

희망이 있습니다.

+0

좋은 답변입니다. 감사! –