2016-09-30 5 views
2

Мне нравится обрабатывать оповещения с помощью Python. То, что я wuold хотел бы сделать это:Как обрабатывать оповещения с помощью Python?

  • Открыть URL
  • Отправить форму или нажмите некоторые ссылки
  • Проверьте, если тревога происходит в новой странице

Я сделал это с Javascript используя PhantomJS, но я бы сделал даже с Python.

Вот Javascript код:

файл test.js:

var webPage = require('webpage'); 
var page = webPage.create(); 

var url = 'http://localhost:8001/index.html' 

page.onConsoleMessage = function (msg) { 
    console.log(msg); 
}  
page.open(url, function (status) {     
    page.evaluate(function() { 
     document.getElementById('myButton').click()  
    });   
    page.onConsoleMessage = function (msg) { 
     console.log(msg); 
    }  
    page.onAlert = function (msg) { 
     console.log('ALERT: ' + msg); 
    };  
    setTimeout(function() { 
     page.evaluate(function() { 
      console.log(document.documentElement.innerHTML) 
     }); 
     phantom.exit(); 
    }, 1000); 
}); 

файл index.html

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title></title> 
    <meta charset="utf-8" /> 
</head> 
<body> 
    <form> 
     <input id="username" name="username" /> 
     <button id="myButton" type="button" value="Page2">Go to Page2</button> 
    </form> 
</body> 
</html> 

<script> 
    document.getElementById("myButton").onclick = function() { 
     location.href = "page2.html"; 
    }; 
</script> 

файл page2.html

<!DOCTYPE html> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
    <title></title> 
    <meta charset="utf-8" /> 
</head> 
<body onload="alert('hello')"> 
</body> 
</html> 

это работает ; он обнаруживает предупреждение на странице2.html. Теперь я сделал этот питон скрипт:

test.py

import requests 
from test import BasicTest 
from selenium import webdriver 
from bs4 import BeautifulSoup 

url = 'http://localhost:8001/index.html'  

def main(): 
    #browser = webdriver.Firefox() 
    browser = webdriver.PhantomJS() 
    browser.get(url) 
    html_source = browser.page_source 
    #browser.quit()  
    soup = BeautifulSoup(html_source, "html.parser") 
    soup.prettify()  
    request = requests.get('http://localhost:8001/page2.html') 
    print request.text  
    #Handle Alert  
if __name__ == "__main__": 
    main(); 

Теперь, как я могу проверить, если тревога происходит на page2.html с Python? Сначала я открываю страницу index.html, затем page2.html. Я нахожусь в начале, поэтому любые предложения будут оценены.

p.s. Я также тестировал webdriver.Firefox(), но он очень медленный. Также я прочел этот вопрос: Check if any alert exists using selenium with python

но он не работает (ниже - тот же предыдущий скрипт плюс решение, предложенное в ответе).

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

.... 

def main(): 
    ..... 
    #Handle Alert 
    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" 

if __name__ == "__main__": 
    main(); 

Я получаю ошибку:

"selenium.common.exceptions.WebDriverException: Сообщение: Invalid Command Method .."

ответ

1

PhantomJS использует GhostDriver для реализации WebDriver провода Протокол, который работает как безгласный браузер в Selenium.

К сожалению, GhostDriver в настоящее время не поддерживает оповещения. Несмотря на то, похоже, они хотели бы помочь реализовать функции:

https://github.com/detro/ghostdriver/issues/20

Вы могли бы переключиться на яваскрипт версию PhantomJS или использовать драйвер Firefox внутри Selenium.

from selenium import webdriver 
from selenium.common.exceptions import NoAlertPresentException 

if __name__ == '__main__': 
    # Switch to this driver and switch_to_alert will fail. 
    # driver = webdriver.PhantomJS('<Path to Phantom>') 
    driver = webdriver.Firefox() 
    driver.set_window_size(1400, 1000) 
    driver.get('http://localhost:8001/page2.html') 

    try: 
     driver.switch_to.alert.accept() 
     print('Alarm! ALARM!') 
    except NoAlertPresentException: 
     print('*crickets*') 
+0

Hi! Спасибо за ответ. Я попытался запустить ваше решение, но оно не работает. Он открывает пустую страницу, и ничего не происходит. Я что-то упускаю? – d3llafr33

+0

Скрипт работает с использованием интерпретатора Python 3.5, это то, что вы используете?Я бы предложил скопировать и вставить код под «__main__»: и инструкции импорта в ваш собственный скрипт. Если он работает правильно, он должен открыть окно Firefox для вашего URL-адреса и распечатать одно из двух сообщений на консоли. – jinksPadlock

+0

Я использовал python 2.7. Я переключился на python 3.5, но результат тот же. Я также следил за вашими предложениями. Я использую selenium v.2.53.6 – d3llafr33