2013-09-25 130 views
32

Tôi đang cố gắng viết một bài kiểm tra với selen bằng ngôn ngữ python cho một trang web quản lý người dùng. Trong trang này, ai đó có thể thêm vai trò cho người dùng và nếu một vai trò tồn tại trong khi thêm nó, một cảnh báo sẽ tăng lên. Tôi không biết cảnh báo có phải là cảnh báo javascript hay phần tử của trang web hay không. Tôi muốn tự động kiểm tra sự tồn tại của cảnh báo, bởi vì kiểm tra vai trò trong danh sách lãng phí thời gian và có một tải trọng rất lớn. Tôi đã thử điều này:Kiểm tra xem có cảnh báo nào đang tồn tại khi sử dụng selen với python

browser = webdriver.Firefox() 
browser.get("url") 
browser.find_the_element_by_id("add_button").click() 
try: 
    alert = browser.switch_to_alert() 
    alert.accept() 
    print "alert accepted" 
except: 
    print "no alert" 

Nhưng nó không hoạt động và tôi nhận được "UnexpectedAlertPresentException". Tôi cũng đã thử điều này:

browser = webdriver.Firefox() 
browser.get("url") 
browser.find_the_element_by_id("add_button").click() 
s = set(browser.window_handles) 
s.remove(browser.current_window_handle) 
browser.switch_to_window(s.pop()) 

Nhưng tôi cũng có ngoại lệ tương tự. Ngoài ra, tôi đã cố gắng truy cập cảnh báo bằng firebug để kiểm tra xem tôi có thể truy cập với các thuộc tính của nó hay không, nhưng nhấp chuột phải đã bị vô hiệu hóa. Tôi cần một giải pháp rất nhanh, ngay cả trong các ngôn ngữ khác. Tôi có thể hiểu cách tiếp cận này. Tôi sẽ đánh giá cao bất kỳ trợ giúp nào.

+2

Bạn đã thử một sự chậm trễ ngắn giữa lần nhấp và switch_to_alert chưa? – Richard

+0

chưa, cảm ơn bạn vì gợi ý này @Richard. Tôi nghĩ rằng tôi có thể sử dụng mã mà A.R. đã cho tôi –

+0

@Richard phải có sự chậm trễ giữa 'switch_to_alert()' thành 'accept()'? Nếu không thì có thể là một vấn đề, bạn nghĩ vậy? –

Trả lời

46

Những gì tôi làm là để thiết lập một sự chậm trễ có điều kiện với WebDriverWait ngay trước thời điểm tôi mong đợi để xem các cảnh báo, sau đó chuyển sang nó, như thế này:

from selenium import webdriver 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.common.exceptions import TimeoutException 

browser = webdriver.Firefox() 
browser.get("url") 
browser.find_the_element_by_id("add_button").click() 

try: 
    WebDriverWait(browser, 3).until(EC.alert_is_present(), 
            'Timed out waiting for PA creation ' + 
            'confirmation popup to appear.') 

    alert = browser.switch_to.alert 
    alert.accept() 
    print("alert accepted") 
except TimeoutException: 
    print("no alert") 

WebDriverWait(browser,) sẽ chờ ít ít nhất 3 giây để cảnh báo được hỗ trợ xuất hiện.

+0

cảm ơn bạn @ A.R. Nó hoàn toàn phù hợp với tôi. Tôi đã bị mắc kẹt vào vấn đề này trong 10 giờ. –

+0

Làm cách nào để phát hiện tất cả các cảnh báo có thể tồn tại trên trang web (popup tự động, mà không cần nhấp vào nút)? –

+8

Chỉ cần một mảnh nhỏ của switch_to_alert info-() bây giờ bị phản đối và đã được thay thế bằng switch_to.alert – demouser123

1

Trong java, chúng tôi làm điều đó như thế này

 WebDriverWait wait3 = new WebDriverWait(driver, 7000); 
     wait3.until(ExpectedConditions.alertIsPresent()); 
     driver.switchTo().alert().accept(); 

Nó ngầm sẽ chờ đợi cảnh báo nếu cảnh báo không được trình bày nó sẽ ném 'Cảnh báo không hiện diện Exceptio' mà chúng tôi có thể bắt và di chuyển về phía trước.

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn bạn @Abhishek Singh. Tôi đã làm tương tự trong python và đó là giải pháp. –

4

Tôi biết đây là câu trả lời quá muộn và bạn đã giải quyết câu hỏi này nhiều năm trước, nhưng tôi vẫn muốn đăng phân tích và phát hiện của mình để tham khảo độc giả có thể trong tương lai.

Tôi đang làm việc trên dự án phát triển trang web Django và hiện tại có lỗi khi một trang web cụ thể được mở, một hộp thông báo lỗi sẽ xuất hiện. Môi trường của tôi là:

  • Django 1,8
  • Python 2.7
  • Selenium 2.46.0

tôi đọc tài liệu here về "UnexpectedAlertPresentException", và nó nói:

Được kích hoạt khi một cảnh báo bất ngờ xuất hiện.

Thường được nâng lên khi một phương thức dự kiến ​​chặn biểu mẫu trình quản trị web thực thi thêm bất kỳ lệnh nào.

Tôi đã thử nghiệm trong dự án của tôi và những phát hiện của tôi là:

  • Khi hộp cảnh báo là lên, find_element_by_X phương pháp có thể thành công.
  • Nhấp chuột() hoặc send_keys() sẽ không thành công với "UnexpectedAlertPresentException".

Vì vậy, tôi nghĩ rằng khối try...catch không làm việc vì "UnexpectedAlertPresentException" được ném trong dòng

browser.find_the_element_by_id("add_button").click() 

cũng Điều này có nghĩa rằng các hộp cảnh báo có thể xuất hiện ngay sau khi trang web được mở bởi dòng này:

browser.get("url") 

Nói cách khác, có thể có vấn đề ẩn sâu phía sau gây ra hộp cảnh báo ngay khi trang được mở. Bạn có thể cần khắc phục vấn đề đó trước.

Một điều nữa là: Giả sử các hộp cảnh báo xuất hiện sau dòng này:

browser.find_the_element_by_id("add_button").click() 

Sau đó alert = browser.switch_to_alert() nên làm việc cũng không có ngoại lệ ném, điều này mâu thuẫn với những gì bạn mô tả ở đây. Điều này cũng làm cho tôi nghĩ rằng vấn đề là sớm nhất là dòng browser.get("url").

Tôi không chắc chắn cách giải pháp đã chọn giúp bạn giải quyết vấn đề vì phân tích của tôi cho thấy sự cố nằm ở một nơi khác. Dù sao, tôi không yêu cầu chọn lại giải pháp được chấp nhận. Tôi chỉ muốn chia sẻ suy nghĩ của mình cho độc giả trong tương lai. Xin lỗi trong trường hợp tôi đã bỏ qua hoặc hiểu nhầm một điều gì đó trong câu hỏi này khiến cho phân tích của tôi sai (và lãng phí thời gian của bạn khi đọc điều này :-).