2017-06-05 1 views
-1

私はリンクをクリックする必要があります。そのリンクは、別の要素の中間にあります。このような何か:要素の下部をクリックしますか?

______________________ 
| A ____________ | <-- on top 
|____|B_________|____| 
    |__________| < - on bottom (need to click this one) 

私は下のリンクをクリックしようとすると、私は

(B) is not clickable at point (254, 5). Other element would receive the click: (A). 

Hereを取得するには、画像(私は私書箱リンクをクリックする必要があります)です。私はここで何をすべきか正確にはわかりません。ありがとう!

ここに問題のHTMLがあります。セレンはスパンlabelFieldWrapperにクリックアクションを送信している:

<div class='clr type_address formFieldContainer'> 
    <span class="labelFieldWrapper"> 
     <label class="placeholder" for="address1"> 
      <span class="labelText">Address 1</span> 
     </label> 
     <input id="address1" name="address1" type="text" value="" autofillparam="ON" size="20" maxlength="60"/><span class="asterisk">*</span> 
    </span> 
    <p class="helpLink"> 
     <a href="javascript: void(0)" 
      onclick="window.open('/checkout/canadian_province_support.jsp', 
      'pobox', 
      'width=450, \ 
      height=200, \ 
      directories=no, \ 
      location=no, \ 
      menubar=no, \ 
      resizable=no, \ 
      scrollbars=1, \ 
      status=no, \ 
      toolbar=no'); 
      return false;">PO Box?</a> <-- Trying to click on this link 
     </p> 
    </div><!-- /formFieldContainer --> 
+0

私は唯一の方法は 'アクション'クラスだと思います。ありがとう – DebanjanB

+0

どうすればいいですか?以前はホバーアクションのために 'Actions'しか使用していませんでした。 – kroe761

+0

目的の要素をクリックするのはややこしいでしょう。 URLを共有することはできますか公共のURLですか?参照のための手作業の手順に言及してください。ありがとう – DebanjanB

答えて

1

をクリック

WebElement element = driver.findElement(By.xpath("someXpath")); 
int halfOfHeight = element.getSize().getHeight()/2; 
// moveToElement* method moves to the middle of element, so we'll also move on half of element and click on the 3rd pix from the bottom 
int offset = halfOfHeight - 3; 

Actions actions = new Actions(driver); 
actions 
     .moveToElement(element) 
     .moveByOffset(0, offset) 
     .click() 
     .build() 
     .perform(); 
+0

はい!それはそれをした!私は '.moveToElement'メソッドの' yOffSet'に '10'を追加しようとしましたが、うまくいきませんでした。 '.moveByOffset'を追加するとうまくいきました。どうもありがとう! – kroe761

+0

よろしくお願いします) –

+0

おそらく、 'yOffSet'を使った' .moveToElement'も助けになるかもしれませんが、要素の先頭から始めるので、同じようにする必要があります。 –

0

私はあなたが XPathを使用することができると思う= //p[@class="helpLink"]/a

+0

それは動作しません。要素を対象とすることは問題ではありません。セレンがPO Boxリンクの代わりに一番上の要素をクリックするということです。 – kroe761

0

これは主にChromeで起こります。 Chromeでは要素の正確な位置が計算されず、常に要素の中央をクリックします。

すると、この問題を解決するには、要素座標を取得し、この場合、あなたには、いくつかの回避策を作ることができるならば、要素の下部にクリックのように、リンク

WebElement link= driver.findElement(By.xpath("xpath of link")); 
((JavascriptExecutor)driver).executeScript("window.scrollTo(0,"+link.getLocation().x+")"); 
link.click(); 
0

私はあなたがより広い方法で問題を見て、要素のどこかをクリックする方法を実装することをお勧めします。以下はコードスニペットです。私はC#で以下を書いて、テストに成功しました。 xとyの座標は要素上でアクションを実行するのを容易にする要素のサイズに関して割り当てられます。

メソッドClickElementAtを実装し、以下のようにメソッドを呼び出すことができます。

ClickElementAt(element,Bottom);//Calling the method here 

//Implementation 
    public void ClickElementAt(Element element, ClickPoint clickPoint) 
    { 
     int x, y; 

     switch (clickPoint) 
     { 
      case ClickPoint.Center: 
       x = element.Size.Width/2; 
       y = element.Size.Height/2; 
       break; 
      case ClickPoint.Top: 
       x = element.Size.Width/2; 
       y = element.Size.Height/10; 
       break; 
      case ClickPoint.Left: 
       x = element.Size.Width/10; 
       y = element.Size.Height/2; 
       break; 
      case ClickPoint.Right: 
       x = element.Size.Width * 90/100; 
       y = element.Size.Height/2; 
       break; 
      case ClickPoint.Bottom: 
       x = element.Size.Width/2; 
       y = element.Size.Height * 90/100; 
       break; 
      default: 
       throw new ArgumentOutOfRangeException("clickPoint"); 
     } 

     var actions = new Actions(this.driver); 
     actions 
      .MoveToElement(element, x, y) 
      .Click() 
      .Perform(); 
    } 
関連する問題