LINUX.ORG.RU

Скрипт python для Selenium

 , ,


0

3

Коллеги, доброго дня. Есть скрипт для генерации временной лицензии для conflunce:

from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re


driver = webdriver.Firefox()
driver.get("https://id.atlassian...atlassian.com")
driver.find_element_by_id("username").send_keys("MY_NAME@XX.ru")
driver.find_element_by_id("form-login").submit()
time.sleep(10)
driver.find_element_by_id("login-submit").click()
driver.find_element_by_id("password").clear()
driver.find_element_by_id("password").send_keys("MY_PASSWORD")
driver.find_element_by_id("login-submit").click()
time.sleep(20)
driver.find_element_by_link_text("New Evaluation License").click()
driver.find_element_by_id("product-select").click()
Select(driver.find_element_by_id("product-select")).select_by_visible_text("Confluence")
driver.find_element_by_xpath("//option[@value='Confluence']").click()
driver.find_element_by_xpath("//div[@id='content']/div/div/div/form/fieldset/div[2]/div/label[2]/span[3]").click()
driver.find_element_by_id("serverid").click()
driver.find_element_by_id("serverid").clear()
driver.find_element_by_id("serverid").send_keys("XXX-XXX-XXX-XXX")
driver.find_element_by_id("generate-license").click()

Лицензия генерится нормально.

Теперь мне необходимо скопировать полученную лицензию и вставить в новое место:

Но у поля сгенерированной лицензии id получается динамический и он будет менять каждый раз при генерации.

Вопрос 1 - как правильно скопировать данные из этого поля.

Вопрос 2 - как правильно вставить эти данные и новое место. Всю голову сломал, прошу подскажите.

Я бы javascript использовал через id = driver.execute_script(«$('...')Тут любой js»).

Вообще при любых проблемах с селениумом проще использовать jQuery из под него.

anonymous
()
Ответ на: комментарий от lucidlynx

Тогда проще весь дом парсить - driver.page_source. И каким нибудь Beautiful Soup его.

Но без javascript тяжко тут.

anonymous
()

Так ты можешь искать элемент/ы не только по id. Вот здесь ты можешь найти другие методы. Посмотри API Selenium'a, там много полезной инфы!

Удачи :)

ubik
()

Но у поля сгенерированной лицензии id получается динамический и он будет менять каждый раз при генерации.

Use XPath, Luke, но без ID. Оно конечно деревянное, но должно хватить. Дикий плюс - его можно прямо в браузере получить\отладить.

как правильно скопировать данные из этого поля.

В Java API есть явный getText() у WebElement.

как правильно вставить эти данные и новое место.

Опять таки есть sendKeys(CharSequence... keysToSend).

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

Огромное спасибо за ответы. Использовать XPath не выйдет, ибо он //*[@id=«licensebox_11434134»], либо я не знаю как правильно его использовать. Если посмотреть html код, то тот блок, в котором должена быть лицензия пуст:

<tr id="license_11434134" class="headingRow  evaluation" data-details-href="#containerrow_11434134">
        <td>
            <span id="plus_11434134" class="action aui-icon aui-icon-small aui-iconfont-collapsed"></span>
            
                <span id="plus_11434134" class="action aui-icon aui-icon-small aui-iconfont-time" title="Evaluation License"></span>
            
            <span>SEN-L11434134</span>
        </td>
        <td>
            <span class="desc"><strong>Confluence (Server): Evaluation</strong></span>
        </td>

        <td class="truncate-ellipsis">
            <span class="name_11434134 account-name">confluence</span>
        </td>


        <td class=" support-expiry-date">
            25 Apr 2018
        </td>

        <td>
            
                <a href="/products/requestsupport/11434134" data-analytics="request-support-link">
                    Request Support
                </a>
            
        </td>
    </tr>

    <tr class="evaluation">
        <td id="containerrow_11434134" style="display:none" class="containerRow" colspan="5">
            <div id="plusrow_11434134" style="display:none" class="plusRow license"></div>
        </td>
    </tr>
Вроде так же нашел в коде скрипт, с помощью которого он выводится
<script type="text/javascript">

        $(document).ready(function() {
            $("#viewlicense").dialog({
                modal: true,
                autoOpen: false,
                draggable: false,
                resizable: false,
                overlay: {
                    opacity: 0.5,
                    background: "black"
                },
                buttons: {
                    "Close": function() {
                        $(this).dialog("close");
                    }
                },
                width:450
            });
        });

        function resetBoxes() {
            $(".flash").fadeOut("normal");
            $("#errorBox").fadeOut("normal");
        }

        function viewLicense(licenseId) {

            resetBoxes();

            $.get("/license/licenseInXml", { id: licenseId },
                    function(data) {

                        var result = $("response", data).attr("result")

                        if (result == "false")
                        {
                            var message = $("response", data).attr("message");

                            $("#error").html(message);
                            $("#errorBox").fadeIn("normal");
                        }
                        else
                        {
                            var license = $("licenseString", data).text();
                            var description = $("description", data).text();
                            var organisation = $("organisation", data).text();
                            var licenseBox = $("licenseDisplay", data).text();

                            $("#licensebox").html(licenseBox);
                            $("#licensedescription").html(description);
                            $("#organisation").text(organisation).html();

                            $("#viewlicense").dialog("open");
                        }
                    });

            return false;
        }

</script>
Правда что делать с ним дальше, я не знаю

lucidlynx
() автор топика
Ответ на: комментарий от lucidlynx

Я так понимаю, что лицензию ты запрашиваешь через my.atlassian.com?

Тогда ты скопировал не тот tr.
Используй вот такой xpath

//tr[th//text()[contains(.,'License Key')]]//textarea

после этого у тебя будет нода с textare. Найди аналог
getAttribute("value")
для питона и будет тебе счастье.

P.S. в Atlassian верстают омерзительные монкеи.

Deleted
()
Ответ на: комментарий от lucidlynx

Всем спасибо разобрался сам! Вот готовый скрипт:

from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()

# -*- coding: utf-8 -*-
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import Select
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoAlertPresentException
import unittest, time, re

##LOGIN
driver = webdriver.Firefox()
driver.get("https://id.atlassian.com/login?application=mac&continue=https://my.atlassian.com")
driver.find_element_by_id("username").send_keys("MYNAME@MYDOMAIN.RU")
driver.find_element_by_id("form-login").submit()
time.sleep(20)
driver.find_element_by_id("login-submit").click()
driver.find_element_by_id("password").clear()
driver.find_element_by_id("password").send_keys("MYPASSWORD")
driver.find_element_by_id("login-submit").click()
time.sleep(20)

#GENERATE LICENSE
driver.find_element_by_link_text("New Evaluation License").click()
driver.find_element_by_id("product-select").click()
Select(driver.find_element_by_id("product-select")).select_by_visible_text("Confluence")
driver.find_element_by_xpath("//option[@value='Confluence']").click()
driver.find_element_by_xpath("//div[@id='content']/div/div/div/form/fieldset/div[2]/div/label[2]/span[3]").click()
driver.find_element_by_id("serverid").click()
driver.find_element_by_id("serverid").clear()
driver.find_element_by_id("serverid").send_keys("SERVERID")
driver.find_element_by_id("generate-license").click()

#SEARCH LICENESE KEY
time.sleep(20)
#
elem = driver.find_element_by_xpath("//textarea[contains(@id, 'licensebox')]").text
# print(elem)

#ADD NEW LICENCE TO CONFLUENCE
driver.get("http://CONFLUENCE.MY_DOMAIN.RU")
time.sleep(10)
driver.find_element_by_id("os_username").clear()
driver.find_element_by_id("os_username").send_keys("USER")
driver.find_element_by_id("os_password").clear()
driver.find_element_by_id("os_password").send_keys("PASSWORD")
driver.find_element_by_name("loginform").submit()
time.sleep(15)
driver.find_element_by_id("admin-menu-link").click()
driver.find_element_by_id("administration-link").click()
driver.find_element_by_id("password").click()
driver.find_element_by_id("password").clear()
driver.find_element_by_id("password").send_keys("PASSWORD")
time.sleep(15)
driver.find_element_by_name("authenticateform").submit()
time.sleep(5)
driver.find_element_by_link_text("License Details").click()
time.sleep(5)
driver.find_element_by_name("licenseString").send_keys(elem)
driver.find_element_by_name("update").click()

driver.quit()

lucidlynx
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.