web-dev-qa-db-ja.com

Webdriverを使用して要素にスクロールしますか?

私はまだ学習中であり、私の質問の1つに答えて: here 、問題の要素が表示されていないため、当然のことだと言われました。

私はドキュメントとSOを見て、ここに最も関連する答えがありました: here

「org.openqa.Selenium.interactions.Actions」クラスを使用して要素に移動できます。

WebElement element = driver.findElement(By.id("my-id"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
## actions.click();
actions.perform();

上記を使用して要素までスクロールしようとすると、WebElement not definedと表示されます。

これは、関連するモジュールをインポートしていないためだと思います。誰かが私がインポートすることになっているものを指摘できますか?

編集:alecxeが指摘したように、これはJavaコードでした。

しかし、しばらくの間、それを理解しようとした直後です。 WebElementのインポート方法を見つけました:

from Selenium.webdriver.remote.webelement import WebElement

私のような人を助けるかもしれません。

それの方法も良い教訓です、IMO:

行った: ドキュメント

class Selenium.webdriver.remote.webelement.WebElement(parent, id_, w3c=False)

上記のコマンド形式に分離する必要があります。

44
Sid

PythonでJavaコードを実行しようとしています。 Python/Seleniumでは、org.openqa.Selenium.interactions.ActionsActionChains class に反映されます。

from Selenium.webdriver.common.action_chains import ActionChains

element = driver.find_element_by_id("my-id")

actions = ActionChains(driver)
actions.move_to_element(element).perform()

または、 scrollIntoView() を使用して「ビューにスクロール」することもできます。

driver.execute_script("arguments[0].scrollIntoView();", element)

違いに興味がある場合:

81
alecxe

質問に対する直接的な回答ではありません(Actionsについてではありません)が、必要な要素まで簡単にスクロールすることもできます。

element = driver.find_element_by_id('some_id')
element.location_once_scrolled_into_view

これは実際にはページ上の要素の座標(xy)を返すことを意図していますが、ターゲット要素まで右にスクロールダウンします

32
Andersson

move_to_element()およびscrollIntoView()に加えて、ビューの要素をcenterにしようとする次のコードをポーズしたかったのです。

desired_y = (element.size['height'] / 2) + element.location['y']
window_h = driver.execute_script('return window.innerHeight')
window_y = driver.execute_script('return window.pageYOffset')
current_y = (window_h / 2) + window_y
scroll_y_by = desired_y - current_y

driver.execute_script("window.scrollBy(0, arguments[0]);", scroll_y_by)
0

execute_javascriptメソッドを介してjavascriptを使用して、要素までスクロールできます。たとえば、ロボットフレームワークでSeleniumLibraryを使用して行う方法は次のとおりです。

web_element = self.selib.find_element(locator)
self.selib.execute_javascript(
    "ARGUMENTS",
    web_element,
    "JAVASCRIPT",
    'arguments[0].scrollIntoView({behavior: "instant", block: "start", inline: "start"});'
)