前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中ghost的使用

Python中ghost的使用

作者头像
py3study
发布2020-01-10 01:23:54
1.2K0
发布2020-01-10 01:23:54
举报
文章被收录于专栏:python3python3

ghost.py

ghost.py is a webkit web client written in python.

from ghost import Ghostghost = Ghost()page, extra_resources = ghost.open("http://jeanphi.fr")assert page.http_status==200 and 'jeanphix' in ghost.content

Installation

First you need to install either PyQt or PySide that are availables for many platforms.

Then you may install ghost.py using pip:

代码语言:javascript
复制
pip install Ghost.py

Browsing

Quick start

First of all, you need a instance of Ghost web client:

from ghost import Ghostghost = Ghost()

Open a web page

Ghost provide a method that open web page the following way:

page, resources = ghost.open('http://my.web.page')

This method returns a tuple of main resource (web page) and all loaded resources (such as CSS files, javascripts, images...).

All those resources are backed as HttpResource objects.

At the moment Httpresource objects provide the following attributes:

  • url: The resource url.
  • http_status: The HTTP response status code.
  • headers: The response headers as a dict.

Execute javascript

Executing javascripts inside webkit frame is one of the most interesting features provided by Ghost:

result, resources = ghost.evaluate( "document.getElementById('my-input').getAttribute('value');")

The return value is a tuple of:

  • last javascript last statement result.
  • loaded resources (e.g.: when an XHR is fired up).

As many other Ghost methods, you can pass an extra parameter that tells Ghost you expect a page loading:

page, resources = ghost.evaluate( "document.getElementById('link').click();", expect_loading=True)

Then the result tuple wil be the same as the one returned by Ghost.open().

Play with forms

Fill a field

You can set a form field value trougth Ghost.set_field_value(selector, value, blur=True, expect_loading=False):

result, resources = ghost.set_field_value("input[name=username]", "jeanphix")

If you set optional parameter `blur` to False, the focus will be left on the field (usefull for autocomplete tests).

For filling file input field, simply pass file path as `value`.

Fill an entire form

You can fill entire form trougth Ghost.fill(selector, values, expect_loading=False):

result, resources = ghost.fill("form", { "username": "jeanphix", "password": "mypassword"})

Submit the form

Yon can submit the form by firing `submit` event:

page, resources = ghost.fire_on("form", "submit", expect_loading=True)

Waiters

Ghost provides several methods for waiting for specific things before the script continue execution:

wait_for_alert()

That wait until a javascript alert() is send.

result, resources = ghost.wait_for_alert()

wait_for_page_loaded()

That wait until a new page is loaded.

page, resources = ghost.wait_for_page_loaded()

wait_for_selector(selector)

That wait until a element match the given selector.

result, resources = ghost.wait_for_selector("ul.results")

wait_for_text(text)

That wait until the given text exists inside the frame.

result, resources = ghost.wait_for_selector("My result")

Confirm

Accept or deny javascript confirm is quite easy:

with Ghost.confirm(): # The confirm() box fired up by click will be accepted self.ghost.click('#confirm-button')with Ghost.confirm(False): # The confirm() box fired up by click will be denied self.ghost.click('#confirm-button')

Prompt

Filling a value in prompt box:

with Ghost.prompt('my value'): # prompt() box fired up by click will be filled with 'my value' self.ghost.click('#prompt-button')

Capture viewport

Ghost.capture_to(path, region=None, selector=None) method let's you take webkit current frame screenshots.

If you need to capture a specific region of the viewport, just provide a selector (or coordinates tuple) that feets your needs:

ghost.capture_to('header.png', selector="header")

Test client

WSGI apps

Requirements:

代码语言:javascript
复制
pip install tornado

ghost.py provides a simple GhostTestCase that deals with WSGI applications:

import unittestfrom flask import Flaskfrom ghost import GhostTestCaseapp = Flask(__name__)@app.route('/')def home(): return 'hello world'class MyTest(GhostTestCase): port = 5000 @classmethod def create_app(cls): return app def test_open_home(self): self.ghost.open("http://localhost:%s/" % self.port) self.assertEqual(self.ghost.content, 'hello world')if __name__ == '__main__': unittest.main()

Debug your test

Tests can be run with a UI by setting display class member to True:

class MyTest(GhostTestCase): display = True

Sample use case

The following test tries to center http://www.openstreetmap.org/ map to France:

# Opens the web pageghost.open('http://www.openstreetmap.org/')# Waits for form search fieldghost.wait_for_selector('input[name=query]')# Fills the formghost.fill("#search_form", {'query': 'France'})# Submits the formghost.fire_on("#search_form", "submit")# Waits for results (an XHR has been called here)ghost.wait_for_selector( '#search_osm_nominatim .search_results_entry a')# Clicks first result linkghost.click( '#search_osm_nominatim .search_results_entry:first-child a')# Checks if map has moved to expected latitudelat, resources = ghost.evaluate("map.center.lat")assert float(lat.toString()) == 5860090.806537

Django

Ghost provides an extension for django built on to of the upcoming LiveServerTestCase.

from ghost.ext.django.test import GhostTestCase

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ghost.py
  • Installation
  • Browsing
  • Quick start
  • Open a web page
  • Execute javascript
  • Play with forms
    • Fill a field
      • Fill an entire form
        • Submit the form
        • Waiters
          • wait_for_alert()
            • wait_for_page_loaded()
              • wait_for_selector(selector)
                • wait_for_text(text)
                • Confirm
                • Prompt
                • Capture viewport
                • Test client
                • WSGI apps
                  • Debug your test
                  • Sample use case
                  • Django
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档