2013-10-15 15 views
13

Tôi đang cố gắng viết điều kiện dự kiến ​​của riêng mình. Những gì tôi cần ... Tôi có một khung nội tuyến. và tôi cũng có một hình ảnh trong đó. Tôi muốn tiếp tục xử lý khi hình ảnh của scr sẽ thay đổi. Những gì tôi đã làm:Python Selenium WebDriver. Viết điều kiện dự kiến ​​của riêng tôi

class url_changed_condition(object): 
    ''' 
    Checks whether url in iframe has changed or not 
    ''' 
    def __init__(self, urls): 
     self._current_url, self._new_url = urls 

    def __call__(self, ignored): 
     return self._current_url != self._new_url 

và sau đó trong đoạn code tôi có:

def process_image(self, locator, current_url): 
    try: 
     WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.TAG_NAME, u"iframe"))) 
     iframe = self.driver.find_element(*locator) 
     if iframe: 
      print "Iframe found!" 
     self.driver.switch_to_frame(iframe) 
     WebDriverWait(self.driver, 10).until(ec.presence_of_element_located((By.XPATH, u"//div"))) 

     # WebDriverWait(self.driver, 10).until(
      # url_changed_condition(
       # (current_url, self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src")))) 

     img_url = self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src") 
     print img_url 
     self.search_dict[self._search_item].append(img_url) 
     self.driver.switch_to_default_content() 
    except NoSuchElementException as NSE: 
     print "iframe not found! {0}".format(NSE.msg) 
    except: 
     print "something went wrong" 
     import traceback 
     import sys 
     type_, value_, trace_ = sys.exc_info() 
     print type_, value_ 
     print traceback.format_tb(trace_) 
    finally: 
     return current_url 

Mã này hoạt động, nhưng trả về cùng url nhiều lần. Vấn đề là khi tôi bỏ ghi chú url_changed_condition nó rơi xuống với TimeoutException trong
(current_url, self.driver.find_element(By.XPATH, u"//a/img").get_attribute(u"src"))
Dòng dưới đây hoạt động tốt ... Tôi không hiểu.

Trả lời

1

Theo documentation:

WebDriverWait theo mặc định gọi ExpectedCondition mỗi 500 mili giây cho đến khi nó trở thành công. Lợi tức thành công là dành cho Loại ExpectedCondition là Boolean trả về true hoặc không null return value cho tất cả các loại ExpectedCondition khác.

Thực tế là bạn nhận được cùng một URL nhiều lần nếu bạn nhận xét việc chờ tùy chỉnh sẽ cho bạn gợi ý.

Trong __call__() bạn luôn quay trở lại False vì URL không bao giờ thay đổi. Vì bạn đang quay trở lại False, ExpectedCondition không bao giờ được đáp ứng và bạn nhận được TimeoutException.

Vì vậy, hãy xác định lại logic ExpectedCondition hoặc kiểm tra cho một trường hợp khác.

+0

bạn đang nói với tôi một cách chính xác những gì tôi đã biết. Câu trả lời của bạn chính xác là những gì tôi đã viết ở đây. Tôi cần 'self.driver.find_element (By.XPATH, u" // a/img "). Get_attribute (u" src ")' được gọi là mỗi 500 mili giây để so sánh giá trị trả về của nó với giá trị mà tôi đã có. Và khi chúng không bằng '__call __()' của tôi sẽ trả về 'True'. –

+0

Tôi chỉ giải thích lý do tại sao bạn có 'TimeoutException', vì trong câu hỏi của bạn, bạn dường như không hiểu tại sao. Như tôi đã nói, vấn đề của bạn là bạn đang kiểm tra yếu tố sai (vì URL dường như không bao giờ thay đổi), hoặc khoảng thời gian chờ quá thấp. Hãy thử tăng nó lên hơn 10 giây. Một tùy chọn khác là kiểm tra trường hợp khác trong khung nội tuyến. Tôi không quen thuộc với trang web bạn đang thử nghiệm, vì vậy không thể giúp bạn thêm. – imiric

+0

Tôi nhận được ở đây vì "Một sự trở lại thành công là cho loại ExpectedCondition là Boolean trả về true hoặc không null trả về giá trị cho tất cả các loại ExpectedCondition khác" Được viết khủng khiếp và làm cho hoàn toàn không có ý nghĩa .... – FoxMulder900

11

Có vẻ như chủ đề này đã bỏ lỡ ví dụ về Điều kiện mong muốn tùy chỉnh.

Nó thực sự khá dễ dàng. Trước hết, một Expected Condition in Python selenium bindings là gì:

Có một bộ lớn của built-in expected condition classes .

Hãy làm việc thông qua ví dụ.Hãy nói rằng chúng ta muốn chờ đợi cho đến khi văn bản của một phần tử sẽ bắt đầu với một văn bản mong muốn:

from selenium.webdriver.support import expected_conditions as EC 

class wait_for_text_to_start_with(object): 
    def __init__(self, locator, text_): 
     self.locator = locator 
     self.text = text_ 

    def __call__(self, driver): 
     try: 
      element_text = EC._find_element(driver, self.locator).text 
      return element_text.startswith(self.text) 
     except StaleElementReferenceException: 
      return False 

Cách sử dụng:

WebDriverWait(driver, 10).until(wait_for_text_to_start_with((By.ID, 'myid'), "Hello, World!")) 
1

Sử dụng các kỹ thuật được mô tả bởi @alecxe, nhưng chút thay đổi để đối phó với expected_conditions chấp nhận phần tử thay vì một định vị : (Trong trường hợp này, vì không có selenium.webdriver.support.expected_conditions.invisibility_of(element), tôi đang chờ phương thức is_displayed() để báo hiệu False)

class wait_for_element_to_be_invisible(object): 
    def __init__(self, element): 
     self.element = element 

    def __call__(self, driver): 
     return not(self.element.is_displayed()) 

def test_collapsible_blocks_expand_or_collapse(self): 
    self.browser.get(self.server_url+'/courses/1/') 
    shadables = self.browser.find_elements_by_class_name('shade') 
    for shadable in shadables: 
     ## parent, then sibling element (*) 
     shady_bit = shadable.find_element_by_xpath('../following-sibling::*') 
     element = WebDriverWait(self.browser, 10).until(
      EC.visibility_of(shady_bit)) 
     shadable.click() 
     element = WebDriverWait(self.browser, 10).until(
      self.wait_for_element_to_be_invisible(shady_bit)) 

Đoạn HTML với các bit tương ứng của DOM là:

<h4 class="shadable"><span class="shade" title="Show/Hide">↓</span> 
    <a href="/link/to/uri">Title of Section</a> 
</h4> 
<article class="abstract"> 
    <p>Descriptive part which is shadable 
    </p> 
</article>` 
Các vấn đề liên quan