소프트웨어/Python

find_element 함수 개조

Nerd Dog 2024. 5. 15. 01:52

 

크롤러를 만들다 보면 find_element 함수를 정말 많이 쓰게 되는데

이게 경우에 따라 원하는 태그에 접근하려면 여러 번 타고 타고 들어가야 하는 경우가 많다 보니

뭔가 범용성이 좋은 함수로 개조하고 싶은 욕구가 느껴지기 마련이다.

그래서 내 경우는 find_element를 find 함수에 넣어서 개조해 사용한다.

 

개조 find 함수

"""
Parameters:
- element: webdriver 혹은 webelement를 인수로 받는다. 둘 다 find_element를 사용할 수 있다.
- classes: 인수를 여러개 받는다. 타깃이 되는 태그 인자들을 받는다.
- nth: 마지막 인자의 개수가 여러개일 경우 1번 2번 같이 지정이 가능하다.
- add: 마지막 인자에서 개수가 정해지고 또 태그가 있을 경우가 있어 추가된 값
- value: 값을 넣으면 send_keys를 통해 값을 해당 태그를 통해 넣어준다.
- get_value: True면 해당 값을 리턴해준다.
"""


def find_tree(element, *classes, nth = None, add = None ,value = None, get_value = None):
    try:
        selector = ' '.join(f'.{cls}' for cls in classes)
        elements = element.find_elements(By.CSS_SELECTOR, selector)
        
        if nth is not None:
            if nth - 1 < len(elements):
                element = elements[nth - 1]
            else:
                raise IndexError(f"No element found at index {nth}")
        else:
            element = elements[0]
        if add:
            element = element.find_element(By.CSS_SELECTOR, f".{add}")
        if value :
            element.send_keys(value)
            return True
        if get_value:
            return element.get_attribute("value")
        return element
    except Exception as e:
        print(f"An error occurred: {e}")
        return None

 

 

element

element를 받는데 이는 webdriver 혹은 webelement를 받는다.

둘 다 find_element를 사용하기에 범용성이 좋고 webdriver에서 중첩된 태그가 많을 경우 이중 3중으로 더 파고들어서 찾는 태그와 상호작용을 가능케 한다.


*classes

*classes는 들어가야 할 태그가 많을 것을 고려해서 인자를 많이 받을 수 있게 만들었다.

예를 들어 card -> form-group -> form-control 값을 찾아서 값을 넣고 싶다면 이렇게 사용할 수 있다.

find(self.web,'card','form-group','form-control',value=str(point_amount))

 

nth

마지막으로 사용한 태그가 여러 개일 경우 그리고 각각을 구별하고 싶다면 nth의 개수를 바꾸면 된다.

find(self.web,'form-control',nth=1,value=Id)
find(self.web,'form-control',nth=2,value=Pw)

 

add

nth 이후에 추가하고 싶은 태그가 하나 있을 경우 사용하면 된다.

nth의 변화가 없다면 그냥 *classes 값에 넣어주면 된다.

find(self.web,'nav-item2',nth=2,add='nav-link').click()

 

value

값을 넣어주고 싶다면 value를 넣어주면 된다.

find(self.web,'card','form-group','form-control',value=str(point_amount))

 

get_value

True를 넣어주면 해당 태그의 값을 읽어온다.