2018年3月31日土曜日

seleniumメモ

グーグルアカウントへのログイン


以前はsubmit()でログインできていたのですが、できなくなったのでTABを使うことにしました。
def login_google():
    try:
        i = b.find_element_by_id('identifierId')
        i.send_keys(USER_ID)
        i.send_keys(Keys.TAB)
        i.send_keys(Keys.TAB)
        i.send_keys(Keys.TAB)
        i.send_keys(Keys.RETURN)
        i = b.find_element_by_name('password')
        i.send_keys(PASSWORD)
        i.send_keys(Keys.TAB)
        i.send_keys(Keys.TAB)
        i.send_keys(Keys.RETURN)
    except:
        pass

・Keys.TABはコンマで繰り返してもよい
・USER_IDとPASSWORDは自由に設定。ファイルで管理してもよし、ハードコードが許容できるならそれでも可

追記: グーグルから不正なログイン扱いにされてブロック。→「自分のPCです」というチェックをすれば直りましたが・・・。




ブラウザが開いていればpass, 開いていなければ開く


try:
    if b:
        pass
except NameError:
    b = webdriver.Firefox()
    time.sleep(3)


デフォルトで値が入っているフォームへのテキスト入力


ちょうどこのbloggerの更新画面がそうなのですが、デフォルトで値が入っているときにハマりました。

ここに解決方法が書いてあるのですが、解決できず・・・。http://aksahu.blogspot.jp/2015/08/dealing-with-input-fields-in-selenium.html

b = webdriver.Firefox()
i = b.find_element_by_class_name('titleField')        
i.click()
i.clear()
i.send_keys('aa')

これで入力はできるものの、デフォルトの値として入ってしまい、投稿すると消えます。ちなみにWordPressはこの方法で対応できたのですが・・・。

結局、無理やり解決しました。 pyautoguiで物理的にクリック。

conda install -c conda-forge pyautogui 

でインストール。あとは座標を決めて、

puautogui.click(X, Y)

でできました。 座標を調べるのは下記参照。

400 Bad Request

bloggerへの投稿をseleniumでテストしていたらgoogleからアクセス制限を受けたのか(??)、BadRequestが連発するようになってしまいました。

調べた限り、アクセス制限などではなくて、単に表示待ちのときに操作しようとすると、エラーになるようです。waitやtime.sleep()とか使って対処しました。

NoAlertPresentExceptionが出る

NoAlertPresentException: Message: No modal dialog is currently open

このエラーが出たときはwebdriverが応答していないようです。ウィンドウがあっても認識されていないなど。


soup.findall ではなくsoup.findAll

大文字だったらOK
小文字allのときはTypeError: 'NoneType' object is not callable が出る

seleniumでhrefを探してクリックする


 find_element_by_xpath を使う
browser = webdriver.Firefox()
i = browser.find_element_by_xpath('//a[@href="#edit_timestamp"]')
i.click()
https://stackoverflow.com/questions/33155454/how-to-find-an-element-by-href-value-using-selenium-python

elementの場所を知る

i = b.find_element_by_class_name('blogg-button')
とやると
i.location

{'x': 800, 'y': 74}
などelementのXY座標が得られます
x = i.location['x']
y = i.location['y']

というようにX,Y座標を別々に知ることもできます。

0 件のコメント:

コメントを投稿