Использование ключевых слов SeleniumLibrary в определениях ключевых слов python [duplicate]

Я обновил решение mthoring для современных версий Chrome:

function logout(secUrl, redirUrl) {
    if (bowser.msie) {
        document.execCommand('ClearAuthenticationCache', 'false');
    } else if (bowser.gecko) {
        $.ajax({
            async: false,
            url: secUrl,
            type: 'GET',
            username: 'logout'
        });
    } else if (bowser.webkit || bowser.chrome) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open(\"GET\", secUrl, true);
        xmlhttp.setRequestHeader(\"Authorization\", \"Basic logout\");\
        xmlhttp.send();
    } else {
// http://stackoverflow.com/questions/5957822/how-to-clear-basic-authentication-details-in-chrome
        redirUrl = url.replace('http://', 'http://' + new Date().getTime() + '@');
    }
    setTimeout(function () {
        window.location.href = redirUrl;
    }, 200);
}
10
задан Community 23 May 2017 в 12:00
поделиться

3 ответа

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

Создание пользовательской библиотеки, которая подклассы Selenium2Library

. Один из способов доступа к внутренним элементам Selenium2Library - написать класс библиотеки, который наследуется от Selenium2Library. Когда вы это сделаете, у вас есть доступ ко всему в исходной библиотеке. Затем вы можете вернуть ссылку на объект WebDriver или просто написать свои собственные ключевые слова в python.

В качестве примера, это обычная библиотека селена, которая имеет новое ключевое слово, которое вернет текущий экземпляр WebDriver , Он делает это, вызывая частный (к исходному методу Selenium2Library) _current_browser. Поскольку это частный метод, нет никакой гарантии, что он выдержит проверку временем, но в то время, когда я пишу это, он существует.

Создайте собственную библиотеку селена

Сначала создайте новый файл python с именем CustomSeleniumLibrary.py. Поместите его туда, где робот может его найти - проще всего просто положить его в ту же папку, что и тестовый набор, который будет его использовать. Поместите в этот файл следующее:

from Selenium2Library import Selenium2Library

# create new class that inherits from Selenium2Library
class CustomSeleniumLibrary(Selenium2Library):
    # create a new keyword called "get webdriver instance"
    def get_webdriver_instance(self):
        return self._current_browser()

Создайте тестовый файл, который использует библиотеку

Затем напишите тестовый пример, который использует это вместо Selenium2Library. Например:

*** Settings ***
| Library | CustomSeleniumLibrary.py
| Suite Teardown | close all browsers

*** Test Cases ***
| Example using custom selenium library
| | Open browser | http://www.example.com | browser=chrome
| | ${webdriver}= | Get webdriver instance
| | log | webdriver: ${webdriver}

Запустить тест

Запустить тест, как и любой другой тест. Когда он завершится, вы увидите что-то подобное в журнале:

16:00:46.887 INFO webdriver: <selenium.webdriver.chrome.webdriver.WebDriver object at 0x10b849410>

Использование объекта в тестовом файле

Сообщение cryptic ...<selenium....WebDriver object...> доказывает, что переменная на самом деле содержит ссылку к объекту WebDriver python. Используя синтаксис расширенного синтаксиса робота, вы можете затем вызвать методы и получить доступ к этим объектам, если хотите. Я не рекомендую делать это таким образом, но я думаю, что очень интересно, что робот поддерживает его:

| | log | The page title is ${webdriver.title}

Создание пользовательской библиотеки, которая ссылается на Selenium2Library

. Второй способ выполнения это использование метода робота для получения экземпляра библиотеки, после чего вы можете получить доступ к объекту, как хотите. Это описано в руководстве пользователя робота; см. Получение активного экземпляра библиотеки из Robot Framework в руководстве пользователя Robot Framework .

Например, ключевое слово get_library_instance из приведенного выше примера будет выглядеть так:

from robot.libraries.BuiltIn import BuiltIn

def get_webdriver_instance():
    se2lib = BuiltIn().get_library_instance('Selenium2Library')
    return se2lib._current_browser()

Обратите внимание, что в этом случае вы должны включить как Selenium2Library , так и ваша пользовательская библиотека:

*** Settings ***
| Library | Selenium2Library
| Library | CustomSeleniumKeywords.py
| Suite Teardown | close all browsers

*** Test Cases ***
| Example using custom selenium keyword
| | Open browser | http://www.example.com | browser=chrome
| | ${webdriver}= | Get webdriver instance
| | log | webdriver: ${webdriver}
19
ответ дан Steve HHH 18 August 2018 в 08:41
поделиться

Взгляните на пример руководства пользователя Robot Framework:

Получение активного экземпляра библиотеки из Robot Framework

Самое большое преимущество над наследованием (как было указано до), заключается в том, что вы можете использовать исходную библиотеку нормально и использовать новую библиотеку в дополнение к ней, когда это необходимо.

3
ответ дан 2 revs, 2 users 89% 18 August 2018 в 08:41
поделиться

Вам не нужен robotf-ramework для «Открыть браузер» и создать все шаги в роботе. Вы можете просто использовать робот в качестве секвенсора и вызывать из обычных скриптов python робота с селеном (установить селен с пипсом). Затем в роботе у вас будет набор тестов обычных небольших скриптов python с селеном. Это немного больше касается навыков программирования, но вы будете использовать более стандартный синтаксис codding в сценариях python, которые управляют ключевыми словами. Таким образом, вы можете инкапсулировать все детали в сценарии python и подвергать только высокий уровень роботу (через тестовый набор).

0
ответ дан DanR 18 August 2018 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: