selenium-webdriver
웹 요소 찾기
수색…
통사론
- ByChained (params By [] bys)
비고
항목은 로케이터 와 By
클래스를 사용하여 Selenium에서 찾을 수 있습니다. Selenium을 사용하여 강력한 자동화 프로젝트를 수행하려면 Web Elements에 대한 로케이터를 현명하게 사용해야합니다. 로케이터는 설명이 있어야 하고 고유 해야하며 변경할 가능성이 없어야합니다. 예를 들어 테스트에서 가양 성을 나타내지는 않습니다. 우선 순위는 다음을 사용하는 것입니다.
- ID - 고유하므로 고유 한 요소를 정확하게 얻을 수 있습니다.
- 클래스 이름 - 설명 적이며 지정된 컨텍스트에서 고유 할 수 있습니다.
- CSS ( xpath보다 나은 성능 ) - 더 복잡한 선택기.
- XPATH - CSS를 사용할 수없는 곳 (예 : XPATH 축 ). 예 :
div::parent
.
나머지 로케이터는 변경이나 렌더링이 발생하기 쉬우므로 쉽게 피할 수 있습니다.
경험 법칙 : 코드가 특정 요소를 찾을 수없는 경우, 한 가지 이유는 코드가 모든 DOM 요소를 다운로드하기를 기다리지 않았기 때문일 수 있습니다. 엘리먼트를 검색하기 전에 짧은 시간 동안 "기다리십시오"(3-5 초를 시도한 다음 필요에 따라 천천히 증가)라고 말하십시오. 다음은 이 질문 에서 가져온 Python 예제입니다.
from selenium import webdriver
import time
browser = webdriver.Firefox()
browser.get("https://app.website.com")
reports_element = browser.find_element_by_xpath("//button[contains(text(), 'Reports')]")
# Element not found! Try giving time for the browser to download all DOM elements:
time.sleep(10)
reports_element = browser.find_element_by_xpath("//button[contains(text(), 'Reports')]")
# This returns correct value!
WebDriver를 사용하여 페이지 요소 찾기
웹 페이지에서 WebElements와 상호 작용하려면 먼저 요소의 위치를 식별해야합니다.
By 는 셀렌에서 사용할 수있는 키워드입니다.
By By ..
- ID 별
- 클래스 이름
- 태그 이름으로
- 이름으로
- 링크 텍스트로
- 부분 링크 텍스트로
- CSS 선택기으로
- XPath를함으로써
- JavaScript 사용
아래 스크립트 예제를 고려하십시오.
<form name="loginForm">
Login Username: <input id="username" name="login" type="text" />
Password: <input id="password" name="password" type="password" />
<input name="login" type="submit" value="Login" />
위의 코드에서 사용자 이름과 비밀번호는 ID를 사용하여 설정됩니다. 이제 ID가있는 요소를 식별하려고합니다.
driver.findElement(By.id(username));
driver.findElement(By.id(password));
셀레늄은 7 개 언어를 지원하므로이 문서는 모든 언어로 요소를 찾을 수있는 아이디어를 제공합니다.
ID로
ID를 사용하여 요소를 찾는 방법의 예 :
<div id="coolestWidgetEvah">...</div>
Java - WebElement element = driver.findElement(By.id("coolestWidgetEvah"));
C# - IWebElement element = driver.FindElement(By.Id("coolestWidgetEvah"));
Python - element = driver.find_element_by_id("coolestWidgetEvah")
Ruby - element = driver.find_element(:id, "coolestWidgetEvah")
JavaScript/Protractor - var elm = element(by.id("coolestWidgetEvah"));
클래스 이름으로
클래스 이름을 사용하여 요소를 찾는 방법의 예 :
<div class="cheese"><span>Cheddar</span></div>
Java - WebElement element = driver.findElement(By.className("cheese"));
C# - IWebElement element = driver.FindElement(By.ClassName("cheese"));
Python - element = driver.find_element_by_class_name("cheese")
Ruby - cheeses = driver.find_elements(:class, "cheese")
JavaScript/Protractor - var elm = element(by.className("cheese"));
태그 이름 별
태그 이름을 사용하여 요소를 찾는 방법의 예 :
<iframe src="..."></iframe>
Java - WebElement element = driver.findElement(By.tagName("iframe"));
C# - IWebElement element = driver.FindElement(By.TagName("iframe"));
Python - element = driver.find_element_by_tag_name("iframe")
Ruby - frame = driver.find_element(:tag_name, "iframe")
JavaScript/Protractor - var elm = element(by.tagName("iframe"));
이름으로
이름을 사용하여 요소를 찾는 방법의 예 :
<input name="cheese" type="text"/>
Java - WebElement element = driver.findElement(By.name("cheese"));
C# - IWebElement element = driver.FindElement(By.Name("cheese"));
Python - element = driver.find_element_by_name("cheese")
Ruby - cheese = driver.find_element(:name, "cheese")
JavaScript/Protractor - var elm = element(by.name("cheese"));
링크 텍스트로
링크 텍스트를 사용하여 요소를 찾는 방법의 예 :
<a href="http://www.google.com/search?q=cheese">cheese</a>>
Java - WebElement element = driver.findElement(By.linkText("cheese"));
C# - IWebElement element = driver.FindElement(By.LinkText("cheese"));
Python - element = driver.find_element_by_link_text("cheese")
Ruby - cheese = driver.find_element(:link, "cheese")
JavaScript/Protractor - var elm = element(by.linkText("cheese"));
부분 링크 텍스트
부분 링크 텍스트를 사용하여 요소를 찾는 방법의 예 :
<a href="http://www.google.com/search?q=cheese">search for cheese</a>>
Java - WebElement element = driver.findElement(By.partialLinkText("cheese"));
C# - IWebElement element = driver.FindElement(By.PartialLinkText("cheese"));
Python - element = driver.find_element_by_partial_link_text("cheese")
Ruby - cheese = driver.find_element(:partial_link_text, "cheese")
JavaScript/Protractor - var elm = element(by.partialLinkText("cheese"));
CSS 선택자에 의한
CSS 선택자를 사용하여 요소를 찾는 방법의 예 :
<div id="food" class="dairy">milk</span>
Java - WebElement element = driver.findElement(By.cssSelector("#food.dairy")); //# is used to indicate id and . is used for classname.
C# - IWebElement element = driver.FindElement(By.CssSelector("#food.dairy"));
Python - element = driver.find_element_by_css_selector("#food.dairy")
Ruby - cheese = driver.find_element(:css, "#food span.dairy.aged")
JavaScript/Protractor - var elm = element(by.css("#food.dairy"));
다음은 CSS 셀렉터 작성에 관한 기사입니다 : http://www.w3schools.com/cssref/css_selectors.asp
XPath로
XPath를 사용하여 요소를 찾는 방법의 예 :
<input type="text" name="example" />
Java - WebElement element = driver.findElement(By.xpath("//input"));
C# - IWebElement element = driver.FindElement(By.XPath("//input"));
Python - element = driver.find_element_by_xpath("//input")
Ruby - inputs = driver.find_elements(:xpath, "//input")
JavaScript/Protractor - var elm = element(by.xpath("//input"));
XPath에 대한 기사는 다음과 같습니다. http://www.w3schools.com/xsl/xpath_intro.asp
JavaScript 사용
임의의 javascript를 실행하여 요소를 찾을 수 있으며 DOM 요소를 반환하면 자동으로 WebElement 객체로 변환됩니다.
jQuery가로드 된 페이지의 간단한 예 :
Java - WebElement element = (WebElement)
((JavascriptExecutor)driver).executeScript("return $('.cheese')[0]");
C# - IWebElement element = (IWebElement)
((IJavaScriptExecutor)driver).ExecuteScript("return $('.cheese')[0]");
Python - element = driver.execute_script("return $('.cheese')[0]");
Ruby - element = driver.execute_script("return $('.cheese')[0]")
JavaScript/Protractor -
참고 : 특정 웹 드라이버가 SimpleBrowser 와 같은 JavaScript를 지원하지 않는 경우이 방법은 작동하지 않습니다.
여러 기준으로 선택 [C #]
선택기를 함께 사용할 수도 있습니다. 이 작업은 OpenQA.Selenium.Support.PageObjects.ByChained
개체를 사용하여 수행됩니다.
element = driver.FindElement(new ByChained(By.TagName("input"), By.ClassName("class"));
임의의 수의 By
체인으로 묶을 수 있고 AND 유형 선택으로 사용됩니다 (즉, 모두 By
가 일치 함)
페이지가로드되기 전에 요소 선택
driver.Navigate().GoToUrl(url);
호출 할 때 driver.Navigate().GoToUrl(url);
페이지가 완전히로드 될 때까지 코드 실행이 중지됩니다. 데이터를 추출하려는 경우에는 때로는 필요하지 않습니다.
참고 : 아래 코드 샘플은 해킹으로 간주 될 수 있습니다. 이것을하는 "공식적인"방법은 없습니다.
새 스레드 만들기
웹 페이지를로드하기위한 스레드를 만들고 실행 한 다음 대기 를 사용하십시오.
기음#
using (var driver = new ChromeDriver())
{
new Thread(() =>
{
driver.Navigate().GoToUrl("http://stackoverflow.com");
}).Start();
new WebDriverWait(driver, TimeSpan.FromSeconds(10))
.Until(ExpectedConditions.ElementIsVisible(By.XPath("//div[@class='summary']/h3/a")));
}
타임 아웃 사용
WebDriverTimeout을 사용하면 페이지를로드 할 수 있고 특정 시간이 지나면 페이지가로드되지 않게하는 예외가 발생합니다. catch 블록에서 Wait 을 사용할 수 있습니다.
기음#
using (var driver = new ChromeDriver())
{
driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5));
try
{
driver.Navigate().GoToUrl("http://stackoverflow.com");
}
catch (WebDriverTimeoutException)
{
new WebDriverWait(driver, TimeSpan.FromSeconds(10))
.Until(ExpectedConditions.ElementIsVisible
(By.XPath("//div[@class='summary']/h3/a")));
}
}
문제 : 너무 짧은 시간 제한을 설정하면 원하는 요소가 있는지 여부에 관계없이 페이지로드가 중단됩니다. 제한 시간을 너무 길게 설정하면 성능 이점을 무효화 할 수 있습니다.