Selenium WebDriverを使用してWebサイトをテストしているときに、クラス継承やActionChainsを使用しなくても、WebElementオブジェクトをダブルクリックすることができます。理想的には、click()と同じように、webelement.double_click()フォームでアクセス可能である必要があります。Pythonを使用してSelenium WebDriver WebElementsに関数を追加する
def double_click(self):
self._execute(Command.DOUBLE_CLICK)
十分なシンプル:これはWebElement.pyファイルを編集し、単にWebElementクラスに以下を追加することによって行うことができます。しかし、私はこのライブラリを常に更新しています。これは上書きされる可能性があります。これを念頭に置いて、私は、この機能を、私が作業しているファイルからWebElementオブジェクトに追加する簡単な方法を理解しようとしています。私はブラウザ(webdriver.Firefoxを())を実行するとき
from selenium import webdriver
from selenium.webdriver.remote.command import Command
from selenium.webdriver.remote.webelement import WebElement
def double_click(self):
self.execute(Command.DOUBLE_CLICK)
WebElement.double_click = double_click
はその後、DOUBLE_CLICKは、各要素のために定義されていますが、それは正しく機能しません。私はWebElementをインポートし、そうのような関数を定義しようとしています。代わりに、それは発生する
WebDriverException: Message: [JavaScript Error: "Argument to isShown must be of type Element" ...
私は同じ方法でclick()関数を再定義すると同じエラーが発生します。私がクリックしようとしている要素は、クラス 'selenium.webdriver.remote.webelement.WebElement'であることが確認されましたが、ワイヤーがどこかで交差しているように見えます。
明らかに、私はこれに対応する回避策があることを知っています。問題は私がダブルクリックすることができないということではない - 私が試みているのと同様の方法でこれが可能かどうかを知りたい。
これは動作します。私はそれを少しでも試してみました...私が知る限り、_parent.executeを呼び出すことは_executeを呼び出すことと同じです。なぜなら、webelement.pyの_execute関数はself._parent.executeを返すからです。鍵はMOVE_TOだそうです。それは、webelementファイルにパッチを当てればうまく機能しても、関数がこれを必要とするのは何ですか? –
コマンド 'DOUBLE_CLICK'は引数をとりません(https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol#sessionsessioniddoubleclick)。 'WebElement'が必須ではない' id'パラメータを追加し、 'MOVE_TO'が' id'ではなく 'element'キーを必要とするため、' WebDriver'で 'execute'を呼び出すほうが良いです。私は 'MOVE_TO'コマンドなしでどのように動作するのか分かりません。おそらく、対象要素が既にフォーカスされているかどうか。また、選択したドライバがプロトコルを別々に実装している可能性もあります。 –