2015-07-20 16 views
6

OpenLayers, Selenium WebDriver (Java sürümü) tabanlı bir API'yi test ediyorum.Selenyum WebDriver içinde xPath nasıl kullanılır SVG öğeleri almak için?

OpenLayers .Control.ModifyFeature kullanan bir işlevi test etmek istiyorum. Çizilen özelliklere (SVG) tıklamak, sürüklemek ve mevcut, görünür veya gizli olup olmadığını kontrol etmek istiyorum.

Çokgen çizdim ve onu seçtim. görüntüsünün altında:

polygon_and_handles

bu SVG öğelerinin HTML buradadır:

<svg id="OpenLayers_Layer_Vector_161_svgRoot" width="1235" height="495" viewBox="0 0 1235 495" style="display: block;"> 
    <g id="OpenLayers_Layer_Vector_161_root" transform="" style="visibility: visible;"> 
     <g id="OpenLayers_Layer_Vector_161_vroot"> 
      <path id="OpenLayers_Geometry_Polygon_200" d=" M 393.0000000000964,213.9999999999891 486.0000000003338,275.9999999997126 384.00000000036925,284.9999999994434 393.0000000000964,213.9999999999891 z" fill-rule="evenodd" fill="blue" fill-opacity="0.4" stroke="blue" stroke-opacity="1" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="none" pointer-events="visiblePainted" cursor="pointer" /> 
      <circle id="OpenLayers_Geometry_Point_619" cx="439.50000000021464" cy="244.99999999985084" r="6" fill="#009900" fill-opacity="0.5" stroke="#ee9900" stroke-opacity="1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="none" pointer-events="visiblePainted" cursor="inherit" /> 
      <circle id="OpenLayers_Geometry_Point_621" cx="435.00000000035106" cy="280.49999999958163" r="6" fill="#009900" fill-opacity="0.5" stroke="#ee9900" stroke-opacity="1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="none" pointer-events="visiblePainted" cursor="inherit" /> 
      <circle id="OpenLayers_Geometry_Point_623" cx="388.50000000023283" cy="249.4999999997126" r="6" fill="#009900" fill-opacity="0.5" stroke="#ee9900" stroke-opacity="1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="none" pointer-events="visiblePainted" cursor="inherit" /> 
      <circle id="OpenLayers_Geometry_Point_202" cx="393.0000000000964" cy="213.9999999999891" r="6" fill="#990000" fill-opacity="1" stroke="#ee9900" stroke-opacity="1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="none" pointer-events="visiblePainted" cursor="inherit" /> 
      <circle id="OpenLayers_Geometry_Point_203" cx="486.0000000003338" cy="275.9999999997126" r="6" fill="#990000" fill-opacity="1" stroke="#ee9900" stroke-opacity="1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="none" pointer-events="visiblePainted" cursor="inherit" /> 
      <circle id="OpenLayers_Geometry_Point_204" cx="384.00000000036925" cy="284.9999999994434" r="6" fill="#990000" fill-opacity="1" stroke="#ee9900" stroke-opacity="1" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="none" pointer-events="visiblePainted" cursor="inherit" /> 
     </g> 
     <g id="OpenLayers_Layer_Vector_161_troot" /> 
    </g> 
</svg> 

varsayalım Ben kırmızı noktaları seçmek istiyor.

Bunu yapan:

String xpath = "//circle[contains(@id, 'OpenLayers_Geometry_Point') AND fill = '#990000']"; 
List<WebElement> vertices = driver.findElements(By.xpath(xpath)); 

Ama her zaman boş bir liste [] döndürür.

Burada yanlış olan ne yapıyorum? Biri bana yardım edebilir mi lütfen?

Çok teşekkürler.

DÜZENLEME 1 - Fonksiyon: verticesAreVisible

tıklayarak eylemler önce, öğelerini almak ve onlar görünür olup olmadığını kontrol etmek istiyorum. Bu işlevi kullanıyorum.

public static boolean verticesAreVisible(WebDriver driver, String xpath) { 
    List<WebElement> list = driver.findElements(By.xpath(xpath)); 
    if (list.isEmpty()) { 
     return false; 
    } 
    boolean visible = true; 
    for (int i = 0; i < list.size(); i++) { 
     visible = visible && list.get(i).isDisplayed(); 
    } 
    return !verticesAreNotVisible(driver) && visible; 
} 

DÜZENLEME 2 - Doğru xPath

// This solution from Razib is valid if the SVG is on the root note 
String xpath = "/*[name()='svg']/*[name()='circle']"; 
// I changed it so that any descendant is valid "//" 
String xpath = "//*[name()='svg']//*[name()='circle']"; 
// Since I wanted only the red vertices, I added this 
String xpath = "//*[name()='svg']//*[name()='circle' and @fill='#990000']"; 

cevap

8

Eylemler, Xpath numaralı name özniteliğiyle birlikte kullanılmalıdır. sizin XPath olarak kullanmak -

"/*[name()='svg']/*[name()='SVG OBJECT']" 

Daha sonra aşağıdaki kod parçacığını deneyin -

WebElement svgObj = driver.findElement(By.xpath(XPATH)); 
Actions actionBuilder = new Actions(driver); 
actionBuilder.click(svgObj).build().perform(); 
+1

Merhaba @Razib. Çalışmak için biraz zaman harcadım, ama bahşiş sayesinde şimdi işe yarıyor! :) Çok teşekkür ederim!!! Çözümle ilgili daha fazla ayrıntı için gönderimdeki düzenlemelere bakın. – joaorodr84

2

@fill yerine fill ve OpenLayers_Geometry_Point yerine OpenLayers.Geometry.Point deneyin.

+0

Merhaba @peetya. 'OpenLayers_Geometry_Point' ipucu için teşekkürler. Alt çizgi ile yer değiştirmeyi tamamen unuttum. Neyse, '@ fill' ipucu çalışmadı. Bu xPath '// * kullanırsa [içerir (@id,' OpenLayers_Geometry_Point ')]' 6 puan alırım. Ama ben sadece 3 kırmızı istiyorum. – joaorodr84

0

sadece visibile elemanları almak için kullanabilirsiniz:

wait = new WebDriverWait(driver, 5); 
wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("bla bla"))); 
İlgili konular