0

Я новичок в RobotFramework (фактически оцениваю его для нового проекта автоматизации тестирования).Расширение selenium2library WebElement в RobotFramework

В прошлом я всегда создавал свои собственные рамки с использованием объектов Java и страниц, но на этот раз мне интересно, могу ли я использовать существующую инфраструктуру. Я оцениваю Spock и Robot Framework.

Мое требование - протестировать веб-приложение, объекты Windows и мобильные приложения, чтобы робот определенно имел преимущество над Spock. Также я бы предпочел Python над Groovy в любой день.

Я обычно расширяю WebElement в своих рамках следующим кодом. Мне интересно, можно ли делать такие вещи в Robot Framework.

//importing webdriver and other selenium libraries 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.WebDriverException; 
import org.openqa.selenium.WebElement; 
import org.openqa.selenium.interactions.internal.Coordinates; 
import org.openqa.selenium.internal.Locatable; 
import org.openqa.selenium.internal.WrapsElement; 
import org.openqa.selenium.support.ui.ExpectedConditions; 
import org.openqa.selenium.support.ui.FluentWait; 
import org.openqa.selenium.support.ui.Wait; 

//interface that will be implemented by my custom web element 
interface MyElement extends WebElement, WrapsElement, Locatable { 

} 

//my custom web element class 
public class MyWebElement implements MyElement { 

    private WebElement element; 

    //private constructor for my web element class 
    private MyWebElement(WebElement element) { 
     this.element = element; 
    } 

    //public factory method for my web element class 
    public static MyWebElement getInstance(By by) { 
     WebElement element = MyWebDriver.getInstance().findElement(by); 
     MyWebElement myWebElement = new MyWebElement(element); 
     return myWebElement; 
    } 

    //overriding WebElement method click 
    @Override 
    public void click() { 
     waitUntilClickable(); 
     element.click(); 
    } 

    //adding method waitUntilClickable to my web element 
    public MyWebElement waitUntilClickable() { 
     return waitUntilClickable(MyWebDriver.getTimeoutElementInMilliseconds(), 
       MyWebDriver.getPollingElementInMilliseconds()); 
    } 

    //adding helper method to implement waitUntilClickable 
    public MyWebElement waitUntilClickable(long timeOutInMilliseconds, 
      long pollingIntervalInMilliseconds) { 
     Wait<WebDriver> wait = new FluentWait<WebDriver>(MyWebDriver.getInstance()) 
       .withTimeout(timeOutInMilliseconds, TimeUnit.MILLISECONDS) 
       .pollingEvery(pollingIntervalInMilliseconds, TimeUnit.MILLISECONDS); 
     wait.until(ExpectedConditions.elementToBeClickable(element)); 
     return this; 
    } 
    //other additional and overriding methods 
    //......................... 
    //......................... 

Robot Framework выглядит хорошо до сих пор, я тоже люблю питон .. но я не знаю, буду ли я в состоянии расширить библиотеки как selenium2library иметь свои собственные методы, как я делал в java в приведенных выше примерах.

+0

Какова ваша фактическая цель? Является ли ваша фактическая цель переопределять методы webelement или ваша цель действительно облегчить вызов функций селена, которые ведут себя так, как вы хотите (например: добавление дополнительных протоколов, ожидание и т. Д.)? Другими словами, переопределяет метод клика цель или просто средство для достижения цели? –

ответ

3

Вы можете, но я не уверен, какую ценность это обеспечивает в отношении рамки робота. Пример того, как подклассы библиотеки и/или получить доступ к реальному объекту webdriver, см. Ответы на этот вопрос: Pass existing Webdriver object to custom Python library for Robot Framework

Однако все, что касается использования робота, заключается в том, что вы не вызываете функции webdriver напрямую. Вы можете переопределить методы (известные как «monkeypatching» в python), и ключевые слова будут использовать ваши исправленные функции, но это не обязательно. Когда вы используете робота, вы не должны взаимодействовать напрямую с веб-элементами.

С рамкой робота вы должны писать тесты, которые являются более абстрактными. Например:

*** Test Cases *** 
| Login with valid credentials 
| | Go to page | LoginPage 
| | Enter the username | [email protected] 
| | Enter the password | letmein! 
| | Click the login button 
| | The current page should be | DashboardPage 

Обратите внимание, что тест не использует веб-элементы вообще. Он использует ключевые слова высокого уровня, которые устраняют необходимость прямого взаимодействия с веб-элементами, добавления ожиданий и т. Д. Писатель теста полностью изолирован от фактической реализации страницы, чтобы они могли сосредоточиться на логике самого теста.

Конечно, робот не предоставляет такие ключевые слова, поскольку он является общей структурой. Он предоставляет общие ключевые слова («перейти на страницу», «кнопка клика» и т. Д.), Но это не то место, где приходит истинная сила рамки робота. Реальная власть исходит от пользовательских библиотек для конкретных страниц.

В вашем примере вы показали переопределение метода click, чтобы вы могли добавить явное ожидание. Вместо того, чтобы переопределять метод, с помощью робота вы можете построить ожидание в ключевом слове, где это имеет смысл.

Например, реализация «Нажмите кнопку для входа» может выглядеть следующим образом:

def click_login_button(self): 
    with self._wait_for_page_refresh(): 
     WebDriverWait(self.browser, 10).until(
      lambda *args: button_element.element_to_be_clickable((By.ID, locator.login_button)) 
     ) 
     self.browser.find_element_by_id(locator.login_button).click() 

В этом примере, мы позаботились, чтобы ждать элемента, чтобы быть интерактивными, щелкаем на нем, а затем мы ожидаем обновления страницы перед возвратом. Обратите внимание, что внутри самого ключевого слова у вас есть полная мощность python и selenium в вашем распоряжении, хотя ни одно из них не видно на уровне тестового теста.


Примечание: эти примеры примерно основаны на библиотеке, которую я написал, которая реализует шаблон объекта страницы с помощью робота. Для получения дополнительной информации об этой библиотеке см. Эту запись в блоге: Robot Framework Page objects

+0

Большое спасибо Брайан за подробное объяснение. Из вашего примера кода мы будем ждать, когда кнопка входа будет доступна для клика, а затем нажмите на нее. Я хочу сделать то же самое для любого веб-элемента, когда хочу нажать на него. Кроме того, я хотел добавить дополнительные функции на уровне WebElement, чтобы эти функции были доступны для всех веб-элементов. Таким образом, ссылка, которую вы предоставили, дает некоторое представление об этом. Я подробно рассмотрю позже. Приятно знать, что вы написали библиотеку шаблонов объектов страницы с помощью робота, потому что я хочу также реализовать иерархические объекты страницы в своих тестах. Я попробую. –

0

Возможно написание расширений в Python и Java. Тем не менее, я думаю, что использование уже available keywords и создание вашей логики тестирования путем создания пользовательских ключевых слов с использованием существующей функциональности - это то, как большинство из нас создает наши тестовые примеры.