2020년 6월 21일 일요일

RPA Framework Browser locator



앞에서 간단하게 Browser 동작되는것을 확인 하였습니다.

from RPA.Browser import Browser

br = Browser()
br.open_chrome_browser("https://www.google.fi",headless=True)
br.input_text("//input[@name='q']", "robocorp")
br.screenshot(page=True, locator="//input[@name='q']")

제대로 사용하기 위해서는 사용법을 익혀야 하는데, document가 좀 부실해서 이것저것 확인 하여서 정리해보았습니다.

위 예제에서 input_text 로 넘어가는 인자에 대해서입니다.


위 링크에 따르면 다음과 같습니다. 첫번째 인자는 locator라는 것입니다.

input_text_when_element_is_visible(locator: strtext: str) → None

Input text into locator after it has become visible.

locator element locator

text insert text to locator


HTML에서 위치를 나타내려는 방법이 어럿 있었으니 이것을 locator 라고 부르며 종류에는 아래와 같은것들이 있습니다.


그중에서도 저기 예제로 들어가 있는것은 XPath라는것입니다.

XPath

XPath is a language for traversing the structure of the DOM (document object model) of the web page.

간단하게 설명하지면 웹페이지의 DOM 구조체를 순회하기위한 언어입니다.

XPath 예제


“raw” XPath

To find the link in this page:

<html><body>
<p>The fox jumped over the lazy brown <a href="dogs.html">dog</a>.</p>
</body></html>
raw XPath는 문서의 처음부터 계층적으로 순회하면서 만들게 됩니다. 즉 dog의 위치는 아래와 같습니다.
/html/body/p/a


Child of Element ID

XPath can find an element by ID like this:

eliment 의 ID에 의해서도 만들수 있습니다.

//*[@id="element_id"]

So if you need to find an element that is near another element with an ID, like the link in this example:

<html><body>
<p id="fox">The fox jumped over the lazy brown <a href="dogs.html">dog</a>.</p>
</body></html>

you could try an XPath like this to find the first link that is a child of the element with ID=”fox”:

//*[@id="fox"]/a

 위 예제에서는 fox id까지 id를 판단하고 설정하고 나서 /a raw XPath를 사용하였습니다.


Button Text

There are two ways to declare a standard button in HTML, discounting the many ways to make something that looks like a button, but is not. To determine how an element is declared in the HTML, see how to inspect an element in the browser.

If the button is declared with the <button> tag and the button says “press me”, try this:

//button(contains(., 'press me')]

If the button is a form submit button (declared with the <input> tag and type=”submit” or =”button”) and says “press me”, try this:

//input[@value='press me']

 버튼의 text를 가지고 위와 같이 설정할 수 있습니다.


Text of element

Sometimes a bit of text is styled as a link or button. To find it, try this:

//*[text()='the visible text']

 이건 텍스트를 나타낼때


The Nth element

To find the Nth element, you must surround your XPath in ()s and then specify the Nth using [n], like this:

(xpath)[n]

A very simple example – find the 3rd link on a page:

(//a)[3]

To find the 4rd text input field on a page:

(//input[@type="text"])[4]

You can also traverse from the indexed element. So, to find the link in the 2nd div with class ‘abc’:

(//div[@class='abc'])[2]/a

마지막으로 몇번째인지 나타낼때 위와 같이 표현하게 됩니다.


결론

그런데 매번 html을 분석해서 지정하기는 힘듭니다. 다행히 크롬 브라우저에 해당 기능이 있어서 쉽게 Xpath를 사용할 수가 있습니다.

브라우저의 F12 키를 눌러 Eliment를 열고 적당한 위치를 찾았으면 마우스 오른쪽 버튼 눌러 Copy를 선택합니다.


www.google.com의 입력하는 위치의 XPath와 full XPath 입니다.

XPath : //*[@id="fakebox-input"]

full XPath(raw XPath) : /html/body/div[4]/div[2]/div/input


테스트

위내용이 정상적으로 동작되는지 테스트 코드를 만들어 보겠습니다.
테스트를 쉽게 하기 위해서 간단한 샘플 html  코드도 만들었습니다.

1.html

<html>
<body>
Text
<form>
<input type='text' id='q' name='qq'></input>
</form>
</body>
</html>


Test Code:

from RPA.Browser import Browser


br = Browser()
br.open_chrome_browser("file:///C:/Users/USER/Documents/python/rpa/1.html")

br.input_text('//*[@id="q"]', "robocorp")
br.screenshot(page=True)

# br.input_text("/html/body/form/input", "robocorp") <<= 에러발생
# br.screenshot(page=True)


테스트 해보니 raw XPath 스타일은 에러가 발생합니다.






댓글 없음:

댓글 쓰기