グーグルアカウントへのログイン
以前は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-pythonelementの場所を知る
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座標を別々に知ることもできます。