xpath에서 contains를 사용하여 요소를 찾는 방법

누구든지 내 xpath에서 contains를 사용하는 방법을 도와 줄 수 있습니까? 내 xpath는 사용자가 추가 될 때마다 변경되므로 “xpath를 사용하여 요소를 찾을 수 없습니다.

이것은 내 xpath입니다.

.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[9]/td/table/tbody/tr/td[1]/strong[2] 

새 사용자 추가시 변경 :

.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2] 

수행 방법을 도와주세요.

댓글

  • 찾으려는 HTML과 요소를 공유하세요.

답변

ExtJS 애플리케이션을 테스트했습니다. 대부분의 페이지 요소 속성은 동적입니다. 새 사용자를 추가 할 때뿐만 아니라 애플리케이션을 열 때마다 변경됩니다.

찾았습니다. 도구 (Firebug 등)에서 얻은 xpath 표현식은 그다지 유용하지 않습니다. 이유는 다음과 같습니다.

  1. 읽기 어려움
  2. 쉽게 깨짐
  3. 디버그하기가 어렵습니다.

대신 HTML을 살펴보고 동적이 아닌 고유 한 속성을 식별하는 데 시간을 투자하고 내 자신의 표현을 생각해내는 것입니다. 속성은 stati입니다 c 특정 요소에 대해 상위 / 하위 / 형제 관계가있는 정적 속성이있는 페이지의 다른 요소를 사용하여 찾습니다.

나는 종종 “contains”를 사용하지만 더 많은 요소가 있습니다. 다음은 몇 가지 예입니다.

  • 다중 조건 : //div[@class="bubble-title" and contains(text(), "Cover")]
  • 부분 일치 : //span[contains(text(), "Assign Rate")]
  • 다음으로 시작 : //input[starts-with(@id,"reportcombo")]
  • 값에 공백이 있음 : //div[./div/div[normalize-space(.)="More Actions..."]]
  • 형제 : //td[.="LoadType"]/following-sibling::td[1]/select"
  • 더 복잡 : //td[contains(normalize-space(@class), "actualcell sajcell-row-lines saj-special x-grid-row-collapsed")]

W3C XSL 함수 페이지에서 더 많은 아이디어를 확인하세요.

수정 : 링크가 업데이트되었습니다. 편집 2 : XPATH 변경됨

댓글

  • 훌륭한 예! ' 많은 동적 양식으로 JSF 앱을 자동화하기 위해 유사한 방법을 사용하고 있습니다. 저는 ' W3C 사양이 매우 유용하다는 것을 발견했습니다.
  • 이 사실을 알게되어 기쁩니다. 누군가가 같은 길을 걸어 왔습니다! 감사합니다!
  • 이전 W3C 사양 링크가 현재 작동하지 않습니다. 대신 이 페이지 를 참조하세요.

답변

명확성을 위해 xpath를 분할하여 개별 테이블을 가져와야합니다.

다음을 제안합니다.

// Get the content or container WebElement content = driver.findElement(By.id("contentText")); //Get the table of users WebElement tblUsers = content.findElement(By.xpath(".//table/tbody/tr[2]/td/table/tbody/tr/td[1]/table")); // Get the rows which change always as and when users are added WebElement allUsers = tblUsers.findElements(By.xpath(".//tbody/tr")); // Loop through each row of users table for(WebElement user : allUsers) { // Get the username WebElement username = user.findElement(By.xpath(".//td/table/tbody/tr/td[1]/strong[2]")); System.out.println("Username: " + username.getText()); } 

댓글

  • 이것은 ' contains 사용 방법에 대한 예를 제공하지 않습니다.

답변

다음과 같은 것을 사용할 수 있습니다.

By.xpath("//td[contains(text(),"youruser")]") //here user text is case sensitive

By.xpath("//td[contains(lower-case(text()),"youruser")]") //to handle case sensitivity. Here user is not case sensitive

답변

.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr[10]/td/table/tbody/tr/td[1]/strong[2] 

XPath는 대폭 단축되어야합니다. 다른 브라우저에서 테스트하는 경우 실패 할 가능성이 있고 페이지에서 변경 사항이 있으면 잘못된 요소를보고 오 탐지 할 수 있습니다. “Relative XPaths”와 “XPath Axes”를 찾아 보는 것이 좋지만 HTML과 웹 페이지의 스크린 샷을 게시하면 더 나은 XPath를 보여 드릴 수 있습니다.

게시 한 내용을 바탕으로, 다음과 같이 할 수 있습니다. //table[@id ="something" 또는 @class="Something that identifies this specific table"]//tr[contains(text(), "something to identify the row") 또는 ./text() = "Exact Text Match"]//strong[2]

일반적으로 표 행을 사용하면 행 내 셀의 텍스트를 기반으로 행을 식별합니다. //table[@id ="something" 또는 @class="Something that identifies this specific table"]//tr[.//td[contains(text(), "something to identify the row") 또는 ./text() = "Exact Text Match"]]//td//strong[2][contains(text(), "Partial Text Match") 또는 ./text() = "Exact Text Match"]

답변

아래 코드를 입력하세요.

public List<WebElement> getText(String xpath) throws Exception { return driver.findElements(By.xpath(xpath)).getText(); } if(tool.getText("//\*[@id="contentText"]//\*/table//\*/strong").contains("<yourtext>")) { system.out.println("Your text is available in the particular xpath"); } else { system.out.println("Your text is not available in the particular xpath"); } 

그것은 나를 위해 잘 작동합니다. 위 코드를 사용하여 모든 xpath에서 텍스트를 찾을 수 있습니다.

답변

XPath 중 2 개가 tr[9]에서 tr[10]로. 세 번째 “tr”의 숫자는 사용자 번호를 의미하는 것 같습니다.

실제로는이 숫자를 삭제하면 HTML에서 모든 사용자 데이터를 추출 할 수 있습니다. (RSelenium + rvest에서 테스트) :

.//*[@id="contentText"]/table/tbody/tr[2]/td/table/tbody/tr/td[1]/table/tbody/tr/td/table/tbody/tr/td[1]/strong[2] 

답변

이미 많은 답변이 있지만 아래 링크를 참조 할 수도 있습니다.

https://medium.com/edureka/xpath-in-selenium-cd659373e01a

XPath 치트 시트

답변

XPATH

driver.findElement(By.xpath("/html/body/div/input[1]")).sendKeys("123"); driver.findElement(By.xpath("//input[1]")).click(); driver.findElement(By.xpath("(//input[1])[4])")).click(); driver.findElement(By.xpath("//tag[@AN="AV"]")).sendKeys("123"); driver.findElement(By.xpath("//tag[text()="AV"]")).sendKeys("123"); driver.findElement(By.xpath("//tag[@AN="AV" and @AN="AV"]")).click(); driver.findElement(By.xpath("//tag[contains(text(),"usrn")]").getText(); driver.findElement(By.xpath("//tag[contains(@AN,"usrn")]").getText(); driver.findElement(By.xpath("//tag[starts-with(text(),"usrn")]").getText(); driver.findElement(By.xpath("//tag[starts-with(@AN,"usrn")]").getText(); ex : //input[starts-with(@id,"reportcombo")] 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다