<dos> パスの設定
パスPATH
の設定。
set PATH=%PATH%;C:\HAGE\HAGE\HAGE
<selenium> Windowサイズを変更
selenium
でウインドサイズwindow size
を変更する技。
In [1]: from selenium import webdriver In [9]: from selenium.webdriver.chrome.options import Options In [10]: options = Options() In [11]: options.add_argument('--window-size=100,100') In [12]: d =webdriver.Chrome(chrome_options=options)
ちなみに、ヘッドレスheadless
にするには下記。
In [13]: options.add_argument('--headless')
スタックさん。
stackoverflow.com
<Python, PyAutoGui, Selenium> 認証ウインドを乗り越える、、
ブラウザBrowser
が出す認証ウインドAuthentication Required
を通過する技。
ググるとこのウインドは、ブラウザが出すもので、Selenium
で制御できないっぽい。
ということで、PyAutoGui
で対応したっす。
ブラウザを画面いっぱいにして、
真ん中に現れる認証ウインドをクリック、
そして、タブで入力箇所を移動して、
IDとパスを入れる。
その後は、Selenium
に制御を戻す。
from selenium import webdriver import pyautogui as pa d = webdriver.Firefox() d.maximize_window() url = 'hoge.hoge.com' w, h = pa.size() pa.moveTo(x=w / 2, y=h / 2, duration=0.0) #Open Browser d.get('') time.sleep(2) #Click Browser and Select URL entry pa.click(x=w / 2, y=h / 2, clicks=2, button="left") pa.press(keys="tab", presses=2) #Input URL and Return "Enter" key pa.typewrite(url, interval=0.0) pa.press(keys="enter", presses=1) time.sleep(2) #Select Authentication Required popup window and enter user_id/password pa.click(x=w / 2, y=h / 2, clicks=2, button="left") pa.press(keys="tab", presses=4) pa.typewrite('USER', interval=0.0) pa.press(keys="tab", presses=1) pa.typewrite('PASSWORD', interval=0.0) pa.press(keys="enter", presses=1) time.sleep(5) #Get Target Page object by Selenium url = 'http://hoge.hoge.com/hage/hagex/' d.get(url)
ぼちぼち動いた。
<PyAutoGUI, Python> オートメーション
オートメーションautomation
、、つまり、マウス、キーボードの自動操作。
PyAutoGUI
でできる。
インストールした。
>pip install python3-xlib >pip install pyautogui
マニュアル。
Welcome to PyAutoGUI’s documentation! — PyAutoGUI 1.0.0 documentation
<Python, BeautifulSoup> HTML属性をゲット
BeautifulSoup
で、HTML属性attribute
をげっちゅうする技。
こんなhtml
テキストがあったとして、、
In [1]: from bs4 import BeautifulSoup In [2]: html = ''' ...: <d> ...: <name>Hage</name> ...: <qty>10</qty> ...: </d> ...: <d> ...: <name>Hige</name> ...: <qty>20</qty> ...: </d> ...: <d> ...: <name>Hoge</name> ...: <qty>12</qty> ...: </d> ...: <d> ...: <name>Haga</name> ...: <qty hage='pikapika' hige='boubou'>15</qty> ...: </d> ...: '''
.findAll()
で<d>
タグを抽出。
In [3]: BeautifulSoup(html, 'lxml').findAll('d') Out[3]: [<d> <name>Hage</name> <qty>10</qty> </d>, <d> <name>Hige</name> <qty>20</qty> </d>, <d> <name>Hoge</name> <qty>12</qty> </d>, <d> <name>Haga</name> <qty hage="pikapika" hige="boubou">15</qty> </d>]
返しのリストの3
番目を選択し、
In [4]: BeautifulSoup(html, 'lxml').findAll('d')[3] Out[4]: <d> <name>Haga</name> <qty hage="pikapika" hige="boubou">15</qty> </d>
で、もって、さらに<qty>
タグを抽出し、
In [6]: BeautifulSoup(html, 'lxml').findAll('d')[3].findAll('qty') Out[6]: [<qty hage="pikapika" hige="boubou">15</qty>]
で、.attrs
でゲット。
In [8]: BeautifulSoup(html, 'lxml').findAll('d')[3].findAll('qty')[0].attrs Out[8]: {'hage': 'pikapika', 'hige': 'boubou'} In [9]: BeautifulSoup(html, 'lxml').findAll('d')[3].findAll('qty')[0].attrs['hage'] Out[9]: 'pikapika'
マニュアル。(日本語版)
kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)
英語。
Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation
<Python, flask> test_client()
Flask
さんをやっていて、app.app_context()
をやるがいいが、
実際の動作request
に対する応答を確認するいい方法がないかと思っていたら、ありました。
さすがっす。
app.test_client()
らしいっす。
このまえ、かりかり作ったスクリプト(下)でちと実験。
In [1]: import restapi In [3]: restapi.db.create_all() In [5]: app = restapi.app.test_client() In [6]: type(app) Out[6]: flask.testing.FlaskClient In [7]: dir(app) Out[7]: ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'allow_subdomain_redirects', 'application', 'cookie_jar', 'delete', 'delete_cookie', 'environ_base', 'get', 'head', 'open', 'options', 'patch', 'post', 'preserve_context', 'put', 'resolve_redirect', 'response_wrapper', 'run_wsgi_app', 'session_transaction', 'set_cookie', 'trace'] In [8]: app.get('/') Out[8]: <Response streamed [404 NOT FOUND]> In [11]: app.get('/sqlalc/1/Taro/Hage') Out[11]: <Response streamed [403 FORBIDDEN]> In [12]: app.put('/sqlalc/-/Taro/Hage') Out[12]: <Response streamed [200 OK]> In [13]: app.get('/sqlalc/1/Taro/Hage') Out[13]: <Response streamed [200 OK]> In [15]: r = app.get('/sqlalc/1/Taro/Hage') In [17]: r.get_data() Out[17]: b'{\n "id": 1, \n "looks": "Hage", \n "name": "Taro", \n "r": "GET success"\n}\n' In [18]: r.get_data().decode('UTF-8') Out[18]: '{\n "id": 1, \n "looks": "Hage", \n "name": "Taro", \n "r": "GET success"\n}\n' In [19]: import json In [20]: json.loads(r.get_data().decode('UTF-8')) Out[20]: {'id': 1, 'looks': 'Hage', 'name': 'Taro', 'r': 'GET success'} In [21]: r.status Out[21]: '200 OK' In [22]: r.status_code Out[22]: 200
にゃるほど!
マニュアル。
API — Flask Documentation (0.12)
Testing Flask Applications — Flask Documentation (0.12)
お世話になったところ。
追記。
app.app_context()
からも順に呼べば、app.test_client()
が呼べる。
In [23]: ctx = restapi.app.app_context() In [25]: type(ctx) Out[25]: flask.ctx.AppContext In [26]: ctx.app.test_client() Out[26]: <FlaskClient <Flask 'restapi'>> In [27]: type(ctx.app.test_client()) Out[27]: flask.testing.FlaskClient In [28]: type(app) Out[28]: flask.testing.FlaskClient