2013-07-16 10 views
13

Pracuję nad aplikacją internetową, w której kliknięcie na jakimś łączu pojawia się kolejne wyskakujące okno. Pop okna nie jest alertem, ale jest formularzem z różnymi polami do wpisania przez użytkownika i kliknij "Dalej".Python webdriver do obsługi wyskakujących okienek przeglądarki, które nie jest alertem

Jak mogę obsłużyć/zautomatyzować okna wyskakujące przy użyciu selenu.

Podsumowanie: -

  1. Kliknij na hiperłącze (URL) - "kliknij tutaj" Formularz rejestracyjny
  2. Użytkownik pojawia się jako pop-up
  3. dane mają być wypełnione przez użytkownika
  4. Kliknij przycisk Dalej/Prześlij.
  5. Innym obok przekierowany do innej strony/formy „Informacja o użytkowniku osobista strona”
  6. danych osobowych jest być wypełnione przez użytkownika
  7. Kliknij „Next/Prześlij”
  8. Popup zniknął.
  9. Teraz dalsze przetwarzanie na stronie oryginalnej/podstawowej.
+0

Jeśli nie jest to alert, istnieje kilka różnych sposobów, w jakie może to być wyskakujące okienko. Czy możesz dołączyć zrzut ekranu aplikacji internetowej i odpowiedni fragment html? –

+0

Czy to może być przyczyną? Zablokowane wywołanie fxdriver.modals.clearFlag_ ... cf. https://stackoverflow.com/questions/44568402/how-do-i-manually-mouse-dismiss-a-javascript-alert-and-get-back-te-the-body-o/44592827#44592827 – NevilleDNZ

Odpowiedz

3

Jeśli jej nowy window lub iframe należy użyć driver.switch_to_frame(webelement) lub driver.switch_to_window(window_name). To powinno następnie umożliwić interakcję z elements w popup. Po zakończeniu, powinieneś następnie driver.switch_to_default_content() powrócić do głównej strony.

25

Przełączanie popup jest wyzwaniem dla co najmniej dwóch odrębnych powodów:

  1. Ten, który wiele osób wie, co jest, że trzeba użyć driver.switch_to.window(window_handle) zarówno gdy pojawi się okienko, dzięki czemu można znaleźć elementy w wyskakującym oknie i po zamknięciu okna, aby można było znaleźć elementy z powrotem w głównym oknie.
  2. Ten, który mogą napotkać tylko ludzie z wolnymi maszynami, co oznacza, że ​​gdy Selenium udostępnia uchwyt okna jako zmienną, początkowo jest ustawiony na Brak i zajmuje trochę czasu, zanim zostanie wypełniony wartością.

Oto kod, który rozwiązuje te problemy podczas wykonywania żądanej sekwencji. Zostawiam instrukcje import i używam nazw zmiennych, które mam nadzieję są oczywiste. Zauważ też, że lubię używać find_element(s)_by_xpath w moim kodzie; czuć się swobodnie korzystać z innych metod find_element(s)_by:

main_window_handle = None 
while not main_window_handle: 
    main_window_handle = driver.current_window_handle 
driver.find_element_by_xpath(u'//a[text()="click here"]').click() 
signin_window_handle = None 
while not signin_window_handle: 
    for handle in driver.window_handles: 
     if handle != main_window_handle: 
      signin_window_handle = handle 
      break 
driver.switch_to.window(signin_window_handle) 
driver.find_element_by_xpath(u'//input[@id="id_1"]').send_keys(user_text_1) 
driver.find_element_by_xpath(u'//input[@value="OK"]').click() 
driver.find_element_by_xpath(u'//input[@id="id_2"]').send_keys(user_text_2) 
driver.find_element_by_xpath(u'//input[@value="OK"]').click() 
driver.switch_to.window(main_window_handle) #or driver.switch_to_default_content() 

Proszę dać mi znać, jeśli ktoś (może ja) musi dodać więcej na przykład, lub zapewnienia innych informacji, aby uczynić go bardziej jasne.

+1

Twoja odpowiedź uratował mi życie jakiś czas temu! Działa jak urok, ale od czasów Chrome 54 i Chromedriver 2.25, nie ma sposobu, aby uzyskać uchwyt okna wyskakującego okienka. W 'kierowcy.window_handles' to tylko główne okno dla mnie. Czy może masz inny pomysł? Dzięki! – monami

+1

Lepiej przełącz się z powrotem do oryginalnego okna, używając 'driver.switch_to_default_content()' jak w @MarkRowlands odpowiedz https://stackoverflow.com/a/17676233/248616 –

Powiązane problemy