ログイン機能のSeleniumテストの一環として、ボタンの座標を特定し、それらの座標をクリックするようにSeleniumに指示して、ボタンをクリックしたいと思います。これは、要素自体を実際に識別することなく行われます(id、xpathなどを使用)。
クリックコマンドを実行する他のより効率的な方法があることは理解していますが、ユーザーエクスペリエンスに最適なこのアプローチを具体的に使用したいと考えています。ありがとう。
isこれを行う方法があります。 ActionChains APIを使用すると、マウスを要素の上に移動し、(要素の中央を基準にして)オフセットを調整して、その場所をクリックできます。 Pythonでwebdriverを使用して行う方法は次のとおりです。
elem = find_element_by_selector(selector)
ac = ActionChains(browser)
ac.move_to_element(elem).move_by_offset(x_off, y_off).click().perform()
あなたは質問をすぐに却下することができます。要素ではなく、特定の場所をクリックする必要がある理由はいくつかあります。私の場合、すべてのクリックをキャッチするオーバーレイ要素を持つSVG棒グラフがあります。いずれかのバーのクリックをシミュレートしたいのですが、オーバーレイがあるため、Seleniumは要素自体をクリックできません。この手法は、イメージマップにも役立ちます。
C#APIでは、アクションを使用します
var element = driver.FindElement(By...);
new Actions(driver).moveToElement(element).moveByOffset(dx, dy).click().perform();
可能であれば、単純なId、CSS、Xpathセレクターを使用するのが最善ですが。ただし、必要なときに機能があります(つまり、機能のために特定の地理的場所の要素をクリックする)。
これは、Actions
のJava
クラスを使用して実行できます。
次のコードを使用-
_new Actions(driver).moveByOffset(x coordinate, y coordinate).click().build().perform();
_
注: Selenium 3はActions
のgeckodriver
クラスをサポートしていません
また、xおよびy座標は、現在のマウス位置からの相対値であることに注意してください。マウス座標が(0,0)から始まると仮定して、絶対値を使用する場合は、上記のコードを使用してクリックした直後に以下のアクションを実行できます。
new Actions(driver).moveByOffset(-x coordinate, -y coordinate).perform();
最初にJavaScriptコードを使用しましたが、Webサイトがクリックしなくなるまで驚くほど機能しました。
だから私はこの解決策を見つけました:
まず、PythonのActionChainsをインポートしてアクティブにします:
from Selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
セッションの特定のポイントをクリックするには、次を使用します。
actions.move_by_offset(X coordinates, Y coordinates).click().perform()
注:上記のコードは、マウスに触れていない場合にのみ機能します。マウスの座標をリセットするには、次を使用します。
actions.move_to_element_with_offset(driver.find_element_by_tag_name('body'), 0,0))
略さずに:
actions.move_to_element_with_offset(driver.find_element_by_tag_name('body'), 0,0)
actions.move_by_offset(X coordinates, Y coordinates).click().perform()
これは、Javaで、要素に関係なく座標をクリックするために働きました。
Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.tagName("body")), 0, 0);
actions.moveByOffset(xCoordinate, yCoordinate).click().build().perform();
コードの2行目は、カーソルをブラウザービューの左上隅にリセットし、最後の行はパラメーターとして提供されたx、y座標をクリックします。
Seleniumへの商用アドオンを使用するオプションがある場合、これはis可能です。ボタンが座標x=123, y=456
にあるとします。次に、 Helium を使用して、次のようにこれらの座標で要素をクリックします。
from helium.api import *
# Tell Helium about your WebDriver instance:
set_driver(driver)
click(Point(123, 456))
(私はヘリウムの著者の一人です。)
Selenium Javaでは、Javascriptを使用して試すことができます。
WebDriver driver = new ChromeDriver();
if (driver instanceof JavascriptExecutor) {
((JavascriptExecutor) driver).executeScript("el = document.elementFromPoint(x-cordinate, y-cordinate); el.click();");
}
IMacros経由でこれを実行できる場合があります http://www.iopus.com/iMacros/
上記の多くのアクションクラスを使用しましたが、Firefox Add-On Measuritを使用して相対座標を取得する要素から相対位置を見つける必要がある場合に役立ちました。例えば:
IWebDriver driver = new FirefoxDriver();
driver.Url = @"https://scm.commerceinterface.com/accounts/login/?next=/remittance_center/";
var target = driver.FindElement(By.Id("loginAsEU"));
Actions builder = new Actions(driver);
builder.MoveToElement(target , -375 , -436).Click().Build().Perform();
要素をクリックしてからクリックする必要があるポイントに達するまで後方にドラッグすると、-375、-436が得られました。 MeasureITが私が差し引いたと言った座標。上記の例では、ページ上でクリック可能な要素は「loginAsEu」リンクのみでした。だからそこから始めました。
import pyautogui
from Selenium import webdriver
driver = webdriver.Chrome(chrome_options=options)
driver.maximize_window() #maximize the browser window
driver.implicitly_wait(30)
driver.get(url)
height=driver.get_window_size()['height']
#get browser navigation panel height
browser_navigation_panel_height = driver.execute_script('return window.outerHeight - window.innerHeight;')
act_y=y%height
scroll_Y=y/height
#scroll down page until y_off is visible
try:
driver.execute_script("window.scrollTo(0, "+str(scroll_Y*height)+")")
except Exception as e:
print "Exception"
#pyautogui used to generate click by passing x,y coordinates
pyautogui.FAILSAFE=False
pyautogui.moveTo(x,act_y+browser_navigation_panel_height)
pyautogui.click(x,act_y+browser_navigation_panel_height,clicks=1,interval=0.0,button="left")
これは私のために働いています。希望、それはあなたのために働くでしょう:)...
アクションチェーンは少し複雑です。 javascriptを実行してこれを実現することもできます。
self.driver.execute_script('el = document.elementFromPoint(440, 120); el.click();')
WebElement button = driver.findElement(By.xpath("//button[@type='submit']"));
int height = button.getSize().getHeight();
int width = button.getSize().getWidth();
Actions act = new Actions(driver);
act.moveToElement(button).moveByOffset((width/2)+2,(height/2)+2).click();