2014-06-10 5 views
2

그래서 웹 애플 리케이션을 테스트하기 위해 python splinter library을 사용하고 있습니다. 제가 실행하고있는 문제는 엘리먼트가 있는지를 확인하고 수동으로 각각을 찾는 것입니다.splinter : 요소를 찾는 더 빠른 방법?

입력 목록이 4 개 이상의 항목보다 커지고 요소가 존재하지 않으면 입력 목록이 완료 될 때까지 12 초 이상 걸립니다.

또한 wait_time = 1로 설정하려고 시도했지만 입력 목록이 10보다 큰 경우 요소가 페이지의 아무 곳에도 존재하지 않으면 총 10 번 걸립니다.

for i in inputs: 
    if browser.element_exists(): 
     elm = browser.find_element(): 
     elm.text() 

나는이 요소 검사가 하나 하나없이 병렬로 발생 있도록이 속도를 할 수있는 방법이 필요합니다. 내가 생각할 수있는 유일한 것은 내가 싫어하는 자바 스크립트를 실행하는 것입니다 (저는 파이썬에서이 모든 것을 유지하고 싶습니다).

def get_columns(current_depth,step,element): 
    columns = [] 
    for xpath in xpaths: 
     what = parse_xpath(row[2]) 
     if browser.is_element_present_by_xpath(xpath,wait_time=1): 
      element = browser.find_by_xpath(xpath) 
      columns.append(element.text) 
     else: 
      columns.append('none') 
    return columns 
+0

명확히하기 위해 : 모든 입력이 동시에 나타 납니까? 또한 테스트 할 수 있도록 링크를 공유 할 수 있습니까? 감사. – alecxe

+0

@alexcxe 예. 입력이 가능합니다. 그것은 기본적으로 xpaths의 목록입니다. 나는이 페이지에서 그것을 테스트하고있다, 그것은 영원히 디렉토리 목록에있는 모든 텍스트를 움켜 잡는다. 내가 자바 스크립트에서 이렇게하면 슈퍼 빠른 일을했을 것입니다하지만 가시와 함께, 그것은 뭔가를 찾지 못할 때마다 기다리는 것 그리고 그것은 합계. http://bit.ly/1p8dLrg – KJW

+0

정보를 제공해 주셔서 감사합니다. 하지만 지금까지 가지고있는 코드도 보여줄 수 있습니까? 이렇게하면 문제를 해결하는 데 도움이 될 것입니다. – alecxe

답변

2

is_element_present_by_xpath 코드는

def is_element_present(self, finder, selector, wait_time=None): 
    wait_time = wait_time or self.wait_time 
    end_time = time.time() + wait_time 
    while time.time() < end_time: 
     if finder(selector): 
      return True 
    return False 

def find_by_xpath(self, xpath, original_find=None, original_query=None): 
    original_find = original_find or "xpath" 
    original_query = original_query or xpath 
    return self.find_by(self.driver.find_elements_by_xpath, 
         xpath, 
         original_find=original_find, 
         original_query=original_query) 

귀하의 코드는 기본적으로 두 번 같은 기능을 사용할 것으로 보인다 사용

def is_element_present_by_xpath(self, xpath, wait_time=None): 
    return self.is_element_present(self.find_by_xpath, xpath, wait_time) 

입니다. 엘리먼트가 처음으로 find_by_xpath을 사용하여 테스트를 위해리스트를 검색하면 엘리먼트를 찾기 위해 두 번째로 테스트를 수행합니다.

find_by_xpathElementList을 반환합니다.

ElementList에는 is_empty() 메서드가 있습니다.이 메서드는 비어 있으면 참 (true)을 반환합니다.

그럼 (테스트하지는 않았지만 내 머리 꼭대기에서 대답).

def get_columns(current_depth,step,element): 
    columns = [] 
    for xpath in xpaths: 
     what = parse_xpath(row[2]) 
     element_list = browser.find_by_xpath(xpath) 
     # You might want to check that your element_list has only 1 element. 
     if element_list.is_empty(): 
      columns.append('none') 
     else: 
      columns.append(element_list[0].text) 
    return columns 

목록을 두 번 통과하지 않아야합니다.

UPDATE 2014년 6월 20일 :

가 토끼 구멍 아래로 간다. 파편은 셀레늄 wedriver를 호출합니다 ... self.find_by(self.driver.find_elements_by_xpath, … 그것은 시작의 또 다른 수준입니다. 왜 그들이 셀레늄을 직접 호출하는 대신에 그렇게하기로 결정했는지 확신 할 수 없습니다.

테스트 용도로만이 코드의 특정 부분을 먼저 사용하여 셀렌을 직접 사용하고 성능에 큰 차이가 있는지 확인해야합니다. 퍼포먼스 이슈가 셀렌이나 셀렌에서 오는 것인지 구분할 수 있습니다. 셀레늄/webdriver/원격/webdriver.py

``DEF find_elements_by_xpath (자기, XPath는)에서

: 는 "" " 은 XPath에 의해 다수의 요소를 찾아 낸다.사용

:Args: 
- xpath - The xpath locator of the elements to be found. 

:Usage: 
    driver.find_elements_by_xpath("//div[contains(@class, 'foo')]") 
""" 
return self.find_elements(by=By.XPATH, value=xpath) 

``

:

``(= By.ID, 값 = 없음 의한 자기) DEF find_elements : "" " '비공개'방법 find_elements_by_ *의 방법에 의해 사용된다.

:Usage: 
     Use the corresponding find_elements_by_* instead of this. 

    :rtype: list of WebElement 
    """ 
    if not By.is_valid(by) or not isinstance(value, str): 
     raise InvalidSelectorException("Invalid locator values passed in") 

    return self.execute(Command.FIND_ELEMENTS, 
         {'using': by, 'value': value})['value'] 

``

이 마지막 API는 JsonWireProtocol을 통한 API에 대한 직접 호출입니다. 여기서 성능은 시스템 및/또는 브라우저를 사용하는 경우 Selenium의 구현에 크게 의존합니다.

업데이트 2 2014년 6월 20일 :

는 또한 특별히 XPath에 대한 점에 유의, 그것은 정말 드라이버가 사용에 따라 달라집니다. The Selenium documentation about this specific search :

높은 수준에서 WebDriver는 가능한 브라우저의 기본 XPath 기능을 사용합니다. 기본 XPath 지원 기능이없는 브라우저에서는 자체 구현을 제공합니다. 다양한 xpath 엔진의 차이점을 알지 못하면 예상치 못한 동작이 발생할 수 있습니다.

+0

나는 이것을 시험해보고 내일을보고 할 것이다. – KJW

+0

이것은 개선되지 않았습니다. 문제는 누락 된 요소를 발견하면 몇 초 동안 기다리는 것입니다. 이 방법을 끄는 유일한 방법은 javascript를 사용하는 것입니다. – KJW

+0

xpath 목록은 무엇입니까? 1 항목 만의 xpath 목록으로 시도 했습니까? – karlcow

관련 문제