Bartłomiej 'furas' Burek
furas.pl
# prywatne notatki - Python, Linux, Machine Learning, etc.

Selenium: Jak zamknąć alert stworzony przez JavaScript

JavaScript może tworzyć trzy standarowe wyskakujące alerty: alert(), confirm() lub prompt().

  • wszystkie z nich mają przycisk OK
  • confirm() i prompt() mają przycisk CANCEL
  • prompt() ma pole tekstowe

Aby wcisnąć OK

driver.switch_to.alert.accept()   # press 'OK'

Aby wcisnąć CANCEL (tylko w confirm() i prompt())

driver.switch_to.alert.dismiss()   # press 'Cancel'

Aby wstawić jakiś tekst w prompt() przez zaakceptowaniem

prompt = driver.switch_to.alert
prompt.send_keys('foo bar')
prompt.accept()

Prawdopodobnie w innych językach jest funkcja get_alert(), która pozwala sprawdzić czy alert jest aktualnie wyświetlany ale Python nie ma takiej funkcji. Ale można kod umieścić w try/except aby go przechwycić błąd gdy alert nie jest aktualnie wyświetlany.

try:
    driver.switch_to.alert.accept()
except Exception as ex:
    print('Exception:', ex)

Minimalny przykład.

Ponieważ nie znam strony, która wyświetla alert więc użyłem execute_script() aby wyświetlić alert.

Używam także console.log() aby zobaczyć w DevTool jaki wynik jest wysyłany do JavaScript.

Pierwsza część sprawdza kod gdy alert jest wyświetlany. Druga część sprawdza kod gdy nie ma alertu.

from selenium import webdriver
import time

#driver = webdriver.Firefox()
driver = webdriver.Chrome()

driver.get('http://google.com')

# --- test when there is alert ---

driver.execute_script("console.log('alert: ' + alert('Hello World!'))")
#driver.execute_script("console.log('alert: ' + confirm('Hello World!'))")
#driver.execute_script("console.log('alert: ' + prompt('Hello World!'))")
time.sleep(2)

try:
    driver.switch_to.alert.accept()  # press OK
    #driver.switch_to.alert.dismiss()  # press CANCEL
except Exception as ex:
    print('Exception:', ex)

# --- test when there is no alert ---

try:
    driver.switch_to.alert.accept()  # press OK
    #driver.switch_to.alert.dismiss()  # press CANCEL
except Exception as ex:
    print('Exception:', ex)

# ---

driver.save_screenshot('image.png')
driver.close()

Jeśli chcesz najpierw wcisnąć CANCEL a to nie działa to wcisnąć OK

try:
    driver.switch_to.alert.dismiss()  # press CANCEL
except Exception as ex:
    print('Exception:', ex)
    try:
        driver.switch_to.alert.accept()   # press OK
    except Exception as ex:
        print('Exception:', ex)
Książki: python-dla-kazdego-podstawy-programowania python-wprowadzenie python-leksykon-kieszonkowy python-receptury python-programuj-szybko-i-wydajnie python-projekty-do-wykorzystania black-hat-python-jezyk-python-dla-hackerow-i-pentesterow efektywny-python-59-sposobow-na-lepszy-kod tdd-w-praktyce-niezawodny-kod-w-jezyku-python aplikacje-internetowe-z-django-najlepsze-receptury