2011-07-21 11 views
11

ログイン機能のセレンテストの一環として、座標を特定し、その座標でセレンをクリックするよう指示するボタンをクリックしたいと思います。これは、実際に要素自体を識別することなく(id、xpathなどを介して)行われます。要素を識別せずに座標をクリックする

私はclickコマンドを実行する他のより効率的な方法があることを理解していますが、私はこのアプローチをユーザーエクスペリエンスに最も適したものにすることを特に考えています。ありがとう。

答えて

-7

セレンはあなたにこれをさせません。

+1

これを可能にする別のテストフレームワークがありますか? Seleniumのユーザー拡張ですか?お返事をありがとうございます。 –

+0

あなたが示唆していることは、一般的に、コメントに収まるよりも多くの理由から、Webアプリケーションをテストするための悪い考えです。あなたはそうすることに強く思っているので、あなたは正当な理由が必要ですが、私は考えることができません。とにかく、おそらくネイティブアプリのテストに焦点を当てたSeleniumよりはるかに洗練されていないシステムを探す必要があります。 Windowsでは、しばしばAutoIt(http://www.autoitscript.com/site/autoit/)を意味します。 –

+0

こんにちは。これと私の他のセレンの質問に、応答してくれてありがとう。私はSelenium 2 Webdriverを見ていきます。これは、ネイティブブラウザの動作を使用するように見えるので、私の問題を回避する可能性があります。 –

-2

ページのソースコードが表示されている場合は、そのidまたはNAME属性でボタンを参照するのに最適なオプションです。たとえば、あなたがボタン「ログイン」を持っている。このように見える:その場合は

<input type="submit" name="login" id="login" /> 

selenium.click(id="login"); 

を行うための最善の方法は、単に好奇心の外にある - HTTP基本真偽イマイチ?その場合、おそらくこれを見てください: http://code.google.com/p/selenium/issues/detail?id=34

+0

ありがとうございますが、これは私が探しているものではありません。セレニウムはidを介してボタンをクリックすることができます。しかし、私は可能な限りユーザー体験をシミュレートしようとしているので、上で説明した方法でボタンをクリックしたいと思います。 –

16

ありはこれを行う方法あるimacrosのを経由してこれを行うことができるかもしれません。 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棒グラフがあります。バーの1つをクリックしてシミュレートしたいのですが、オーバーレイが存在するため、Seleniumは要素自体をクリックできません。このテクニックは、イメージマップにも役立ちます。

ことが可能な場合は、単純なID、CSS、XPathのセレクターを使用するのが最適ですが、アクション

var element = driver.FindElement(By...); 
new Actions(driver).MoveToElement(element).MoveByOffset(dx, dy).Click().Perform(); 

を使用するC#のAPIで

+0

別の回答に記載されているように、この方法で要素内のある位置をクリックすることができます。 OPが求めるものではありませんが、別のユースケースではうまくいくでしょう。 –

+3

コードの最初の行にある要素を特定していますが、OPは要素を特定せずにその方法を明示しています。 – Ardesco

+0

しかし、これはページ内の任意の点をクリックすることはできませんか? "アクションチェーン(ブラウザ).move_to_element(find_element_by_tag_name( 'html'))。move_by_offset(x、y).click()。perform()' '? –

14

。しかし、機能が必要なときに(機能のために特定の地理的場所の要素をクリックする)。

+0

実際、この方法で要素内のある位置をクリックすることができます。 OPが求めるものではありませんが、別のユースケースではうまくいくでしょう。 –

+0

はい、フラッシュゲームのxyを取得してから、フラッシュが通常はpxサイズに固定されているため、カスタムボタンをクリックしてオフセットを使用することもできます。 – erm3nda

3

Seleniumへの商用アドオンを使用する場合、このです。ボタンが座標x=123, y=456にあるとします。その後、あなたは次のようにこれらの座標に要素をクリックするHeliumを使用することができます。

from helium.api import * 
# Tell Helium about your WebDriver instance: 
set_driver(driver) 
click(Point(123, 456)) 

(私はヘリウムの著者の一人です。)

0

アクション鎖は少し気難しいことができます。また、javascriptを実行することでこれを達成することもできます。

self.driver.execute_script('el = document.elementFromPoint(440, 120); el.click();') 
2

これは、次のコードjava

使用中Actionsクラスを使用して行うことができます -

new Actions(driver).moveByOffset(x coordinate, y coordinate).click().build().perform(); 

注:セレン3はまたgeckodriver

ためActionsクラスをサポートしていません。 xとyの座標は、現在のマウス位置。マウス座標が(0,0)で始まると仮定し、絶対値を使用する場合は、上記のコードをクリックした直後に以下のアクションを実行できます。セレンJavaでは

new Actions(driver).moveByOffset(-x coordinate, -y coordinate).perform();

+0

理想的には、これは最新バージョンのセレンの答えになるはずです。 – Andrews

0

、あなたはJavascriptを使用して、それを試すことができます。

WebDriver driver = new ChromeDriver(); 
 

 
if (driver instanceof JavascriptExecutor) { 
 
\t ((JavascriptExecutor) driver).executeScript("el = document.elementFromPoint(x-cordinate, y-cordinate); el.click();"); 
 
}

0

私は、上記の多くのようなアクションクラスを使用しますが、あればどのような私が役に立ったと評価していしていました私は相対座標を得るために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"リンクでした。だから私はそこから始めた。

0
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(); 
+0

あなたのコードポストを、なぜクエリーの要求に合っているのかについての説明とともに括弧で囲むことができます。 – CDove

関連する問題