You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ORPA-pyOpenRPA/Sources/pyOpenRPA/Robot/UIWeb.py

744 lines
38 KiB

from selenium import *
from selenium import webdriver, common
from selenium.webdriver.common.by import By
from selenium.common.exceptions import JavascriptException
import os
import sys
import json
from pyOpenRPA.Tools import CrossOS
import time
2 years ago
# XPATH CSS CHEAT CHEET: https://devhints.io/xpath
# XPATH CSS CHEAT CHEET: https://devhints.io/css
2 years ago
UIO_WAIT_SEC_FLOAT = 60
UIO_WAIT_INTERVAL_SEC_FLOAT = 1.0
gBrowser:webdriver.Chrome = None
def BrowserChromeStart(inDriverExePathStr:str = None, inChromeExePathStr:str = None, inExtensionPathList:list = None, inProfilePathStr:str=None, inSaveAsPDFBool = False, inSavefileDefaultDirStr = None) -> webdriver.Chrome:
"""L+,W+: Выполнить запуск браузера Chrome. Если вы скачали pyOpenRPA вместе с репозиторием, то будет использоваться встроенный браузер Google Chrome. Если установка pyOpenRPA производилась другим способом, то требуется указать расположение браузера Google Chrome и соответствующего WebDriver
2 years ago
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.BrowserClose()
2 years ago
:param inDriverExePathStr: Путь до компонента webdriver.exe, по умолчанию None (путь до webdriver.exe, который расположен в репозитории pyOpenRPA)
2 years ago
:type inDriverExePathStr: str, опционально
2 years ago
:param inChromeExePathStr:Путь до компонента chrome.exe, по умолчанию None (путь до chrome.exe, который расположен в репозитории pyOpenRPA)
2 years ago
:type inChromeExePathStr: str, опционально
2 years ago
:param inExtensionPathList: Список путей, по которым располагаются расширения Chrome, по умолчанию None
2 years ago
:type inExtensionPathList: list, опционально
2 years ago
:param inProfilePathStr: Путь, по которому выполнить сохранения профиля Chrome (история, куки и т.д.), по умолчанию None (профиль не сохраняется)
2 years ago
:type inProfilePathStr: str, опционально
:param inSaveAsPDFBool: Флаг, который обеспечивает настройки окна печати вэб-страницы как "Сохранить как PDF", по умолчанию False (настройки по умолчанию)
:type inSaveAsPDFBool: bool, опционально
:param inSavefileDefaultDirStr: Путь, по которому выполнить сохранения файла (после работы с окном печать вэб-страницы браузера) (история, куки и т.д.), по умолчанию None (файл не сохраняется)
:type inSavefileDefaultDirStr: str, опционально
2 years ago
:return: Объект браузера Google Chrome
:rtype: webdriver.Chrome
"""
global gBrowser
inDriverExePathStr = CrossOS.PathStr(inPathStr=inDriverExePathStr)
inChromeExePathStr = CrossOS.PathStr(inPathStr=inChromeExePathStr)
lExtensionPathList = []
if inExtensionPathList is not None:
for lItemStr in inExtensionPathList:
lExtensionPathList.append(CrossOS.PathStr(inPathStr=lItemStr))
inExtensionPathList = lExtensionPathList
inChromeExePathStr = CrossOS.PathStr(inPathStr=inChromeExePathStr)
inProfilePathStr = CrossOS.PathStr(inPathStr=inProfilePathStr)
lResourcePathStr = os.path.abspath(os.path.join(sys.executable, "..","..", ".."))
# Путь по умолчанию к портативному браузеру и драйверу (если скачивался репозиторий pyOpenRPA
if inDriverExePathStr == None:
if CrossOS.IS_WINDOWS_BOOL: inDriverExePathStr = os.path.join(lResourcePathStr, "SeleniumWebDrivers", "Chrome", "chromedriver_win32 v84.0.4147.30", "chromedriver.exe")
elif CrossOS.IS_LINUX_BOOL: inDriverExePathStr = os.path.join(lResourcePathStr, "SeleniumWebDrivers", "Chrome", "chromedriver_lin64 v103.0.5060.53", "chromedriver")
if inChromeExePathStr == None:
if CrossOS.IS_WINDOWS_BOOL: inChromeExePathStr = os.path.join(lResourcePathStr, "WChrome64-840414730", "App", "Chrome-bin", "chrome.exe")
elif CrossOS.IS_LINUX_BOOL: inChromeExePathStr = os.path.join(lResourcePathStr, "LChrome64-10305060114", "data", "chrome")
if inExtensionPathList == None: inExtensionPathList = []
# Установка настроек окна печати, если необходимо
lWebDriverChromeOptionsInstance = webdriver.ChromeOptions()
if inSaveAsPDFBool == True and inSavefileDefaultDirStr is not None:
print_settings = {
"recentDestinations": [{
"id": "Save as PDF",
"origin": "local",
"account": "",
}],
"selectedDestinationId": "Save as PDF",
"version": 2, # в chrome - это номер варинта "сохранить как PDF"
"isHeaderFooterEnabled": False, # хедеры HTML на странице
"isLandscapeEnabled": False # ориентация (True - альбомная)
}
prefs = {'printing.print_preview_sticky_settings.appState': json.dumps(print_settings),
"download.prompt_for_download": False,
"profile.default_content_setting_values.automatic_downloads": 1,
"download.default_directory": inSavefileDefaultDirStr,
"savefile.default_directory": inSavefileDefaultDirStr,
"download.directory_upgrade": True,
"safebrowsing.enabled": True}
lWebDriverChromeOptionsInstance.add_experimental_option('prefs', prefs)
lWebDriverChromeOptionsInstance.add_argument('--kiosk-printing')
# Set full path to exe of the chrome
lWebDriverChromeOptionsInstance.binary_location = inChromeExePathStr
#lWebDriverChromeOptionsInstance2 = webdriver.ChromeOptions()
if inProfilePathStr is not None:
inProfilePathStr = os.path.abspath(inProfilePathStr)
2 years ago
lWebDriverChromeOptionsInstance.add_argument(f"user-data-dir={os.path.abspath(inProfilePathStr)}")
# Add extensions
for lExtensionItemFullPath in inExtensionPathList:
2 years ago
lWebDriverChromeOptionsInstance.add_extension (os.path.abspath(lExtensionItemFullPath))
#if inDriverExePathStr == "built-in":
# Run with specified web driver path
gBrowser = webdriver.Chrome(executable_path = inDriverExePathStr, options=lWebDriverChromeOptionsInstance)
#else:
# lWebDriverInstance = webdriver.Chrome(options = lWebDriverChromeOptionsInstance)
return gBrowser
def BrowserChange(inBrowser):
2 years ago
"""L+,W+: Выполнить смену активного браузера (при необходимости).
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
lBrowser1 = UIWeb.BrowserChromeStart()
UIWeb.BrowserChange(inBrowser=None)
lBrowser2 = UIWeb.BrowserChromeStart()
UIWeb.BrowserClose()
UIWeb.BrowserChange(inBrowser=lBrowser1)
UIWeb.BrowserClose()
2 years ago
:param inBrowser: Объект браузера
:type inBrowser: webdriver.Chrome
"""
global gBrowser
gBrowser = inBrowser
2 years ago
def PageOpen(inURLStr: str):
"""L+,W+: Открыть страницу inURLStr в браузере и дождаться ее загрузки.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
2 years ago
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
UIWeb.BrowserClose()
2 years ago
:param inURLStr: URL адрес страницы
:type inURLStr: str
"""
global gBrowser
if gBrowser is not None: gBrowser.get(inURLStr)
def PagePrint():
"""L+,W+: Открыть окно печати браузера.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
import time
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
time.sleep(1)
UIWeb.PagePrint()
UIWeb.BrowserClose()
"""
PageJSExecute(inJSStr=f"window.print()")
def PageScrollTo(inVerticalPxInt=0, inHorizontalPxInt=0):
2 years ago
"""L+,W+: Выполнить прокрутку страницы (по вертикали или по горизонтали)
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
2 years ago
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
2 years ago
UIWeb.PageScrollTo(inVerticalPxInt=100)
2 years ago
UIWeb.BrowserClose()
2 years ago
:param inVerticalPxInt: Величина вертикальной прокрутки страницы в пикселях, по умолчанию 0
:type inVerticalPxInt: int, опционально
:param inHorizontalPxInt: Величина горизонтальной прокрутки страницы в пикселях, по умолчанию 0
:type inHorizontalPxInt: int, опционально
"""
PageJSExecute(inJSStr=f"scroll({inHorizontalPxInt},{inVerticalPxInt})")
2 years ago
def PageJSExecute(inJSStr, *inArgList):
2 years ago
"""L+,W+: Отправить на выполнение на сторону браузера код JavaScript.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
2 years ago
!ВНИМАНИЕ! Данная функция поддерживает передачу переменных в область кода JavaScript (*inArgList). Обратиться к переданным переменным из JavaScript можно с помощью ключевого слова: arguments[i], где i - это порядковый номер переданной переменной
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
UIWeb.PageJSExecute(alert('arguments[0]);", "hello world!")
UIWeb.BrowserClose()
2 years ago
:param inJSStr: Код JavaScript, отправляемый на сторону браузера
:type inJSStr: str
:param *inArgList: Перечисление аргументов, отправляемых на сторону браузера
:type *inArgList: str
:return: Результат отработки кода JavaScript, если он заканчивался оператором "return"
:rtype: str | int | bool | float
"""
2 years ago
# arguments[0], arguments[1] etc
global gBrowser
2 years ago
if gBrowser is not None: return gBrowser.execute_script(inJSStr, *inArgList)
def BrowserClose():
2 years ago
"""L+,W+: Закрыть браузер
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
UIWeb.BrowserClose()
"""
global gBrowser
if gBrowser is not None: gBrowser.close() # ранее был gBrowser.close(), но он трактуется браузером как принудительное завершение
def UIOSelectorList(inUIOSelectorStr, inUIO=None) -> list:
2 years ago
"""L+,W+: Получить список UIO объектов по UIO селектору.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
2 years ago
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIOList = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)
2 years ago
UIWeb.BrowserClose()
:param inUIOSelectorStr: XPATH или CSS селектор UI объекта на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath
:type inUIOSelectorStr: str
:param inUIO: Объект UIO, от которого выполнить поиск UIO объектов по селектору, по умолчанию None
:type inUIO: WebElement, опционально
:return: Список UIO объектов
:rtype: list
"""
lResultList = []
if inUIO is None:
global gBrowser
if gBrowser is not None:
2 years ago
if UIOSelectorDetect(inUIOSelectorStr=inUIOSelectorStr) == "CSS":
lResultList = gBrowser.find_elements(By.CSS_SELECTOR, inUIOSelectorStr)
2 years ago
else:
lResultList = gBrowser.find_elements(By.XPATH,inUIOSelectorStr)
2 years ago
else:
if UIOSelectorDetect(inUIOSelectorStr=inUIOSelectorStr) == "CSS":
lResultList = inUIO.find_elements(By.CSS_SELECTOR, inUIOSelectorStr)
2 years ago
else:
lResultList = inUIO.find_elements(By.XPATH,inUIOSelectorStr)
return lResultList
def UIOSelectorFirst(inUIOSelectorStr, inUIO=None) -> list:
2 years ago
"""L+,W+: Получить UIO объект по UIO селектору.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
2 years ago
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIO = UIWeb.UIOSelectorFirst(inUIOSelectorStr = lUIOSelectorStr)
2 years ago
UIWeb.BrowserClose()
:param inUIOSelectorStr: XPATH или CSS селектор UI объекта на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath
:type inUIOSelectorStr: str
:param inUIO: Объект UIO, от которого выполнить поиск UIO объектов по селектору, по умолчанию None
:type inUIO: WebElement, опционально
:return: Первый подходящий UIO объект
:rtype: UIO объект
"""
lResult = None
lUIOList = UIOSelectorList(inUIOSelectorStr=inUIOSelectorStr, inUIO=inUIO)
if len(lUIOList) > 0: lResult = lUIOList[0]
return lResult
def UIOTextGet(inUIO) -> str:
2 years ago
"""L+,W+: Получить текст UI элемента.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
2 years ago
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0]
2 years ago
lTextStr = UIWeb.UIOTextGet(inUIO=lUIO)
UIWeb.BrowserClose()
:param inUIO: UIO элемент. Получить его можно с помощью функций UIOSelectorList или UIOSelectorFirst
:type inUIO: WebElement
:return: Текст UI элемента
:rtype: str
"""
return inUIO.text
def UIOAttributeGet(inUIO, inAttributeStr) -> str:
2 years ago
"""L+,W+: Получить обычный (нестилевой) атрибут у UI элемента.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
2 years ago
.. code-block:: python
2 years ago
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0]
2 years ago
UIWeb.UIOAttributeGet(inUIO=lUIO, inAttributeStr = "href")
UIWeb.BrowserClose()
:param inUIO: UIO элемент. Получить его можно с помощью функций UIOSelectorList или UIOSelectorFirst
:type inUIO: WebElement
:param inAttributeStr: Наименование обычного (нестилевого) атрибута
:type inAttributeStr: str
:return: Значение обычного (нестилевого) атрибута
:rtype: str
"""
return inUIO.get_attribute(inAttributeStr)
def UIOAttributeStyleGet(inUIO, inAttributeStr) -> str:
2 years ago
"""L+,W+: Получить стилевой атрибут у UI элемента.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
2 years ago
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0]
2 years ago
UIWeb.UIOAttributeStyleGet(inUIO=lUIO, inAttributeStr = "href")
UIWeb.BrowserClose()
2 years ago
:param inUIO: UIO элемент. Получить его можно с помощью функций UIOSelectorList или UIOSelectorFirst
:type inUIO: WebElement
:param inAttributeStr: Наименование стилевого атрибута
:type inAttributeStr: str
:return: Значение стилевого атрибута
:rtype: str
"""
2 years ago
return inUIO.value_of_css_property(inAttributeStr)
2 years ago
def UIOAttributeSet(inUIO, inAttributeStr, inValue):
"""L+,W+: Установить обычный (нестилевой) атрибут у UI элемента.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0]
UIWeb.UIOAttributeSet(inUIO=lUIO, inAttributeStr = "href", inValue = "https://mail.ru")
UIWeb.BrowserClose()
:param inUIO: UIO элемент. Получить его можно с помощью функций UIOSelectorList или UIOSelectorFirst
:type inUIO: WebElement
:param inAttributeStr: Наименование обычного (нестилевого) атрибута
:type inAttributeStr: str
:param inValue: Устанавливаемое значение обычного (нестилевого) атрибута
:type inValue: str
"""
2 years ago
lJSStr = \
f"arguments[0].setAttribute(arguments[1], arguments[2]);"
gBrowser.execute_script(lJSStr,inUIO, inAttributeStr, inValue)
2 years ago
def UIOAttributeRemove(inUIO, inAttributeStr):
"""L+,W+: Удалить обычный (нестилевой) атрибут у UI элемента.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0]
UIWeb.UIOAttributeRemove(lUIO, "href")
UIWeb.BrowserClose()
:param inUIO: UIO элемент. Получить его можно с помощью функций UIOSelectorList или UIOSelectorFirst
:type inUIO: WebElement
:param inAttributeStr: Наименование обычного (нестилевого) атрибута
:type inAttributeStr: str
"""
2 years ago
lJSStr = \
f"arguments[0].removeAttribute(arguments[1]);"
gBrowser.execute_script(lJSStr,inUIO, inAttributeStr)
2 years ago
def UIOAttributeStyleSet(inUIO, inAttributeStr, inValue):
"""L+,W+: Установить стилевой атрибут у UI элемента.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0]
UIWeb.UIOAttributeStyleSet(inUIO=lUIO, inAttributeStr = "color", inValue = "grey")
UIWeb.BrowserClose()
:param inUIO: UIO элемент. Получить его можно с помощью функций UIOSelectorList или UIOSelectorFirst
:type inUIO: WebElement
:param inAttributeStr: Наименование стилевого атрибута
:type inAttributeStr: str
:param inValue: Устанавливаемое значение стилевого атрибута
:type inValue: str
"""
2 years ago
lJSStr = \
f"arguments[0].style[arguments[1]]=arguments[2];"
gBrowser.execute_script(lJSStr,inUIO, inAttributeStr, inValue)
def UIOAttributeStyleRemove(inUIO, inAttributeStr:str):
"""L+,W+: Удалить стилевой атрибут у UI элемента.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0]
UIWeb.UIOAttributeStyleRemove(lUIO, "color")
UIWeb.BrowserClose()
:param inUIO: UIO элемент. Получить его можно с помощью функций UIOSelectorList или UIOSelectorFirst
:type inUIO: WebElement
:param inAttributeStr: Наименование стилевого атрибута
:type inAttributeStr: str
"""
2 years ago
lJSStr = \
f"arguments[0].style[arguments[1]]=\"\";"
gBrowser.execute_script(lJSStr,inUIO, inAttributeStr)
def UIOClick(inUIO):
"""L+,W+: Выполнить нажатие по элементу inUIO.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lUIO = UIWeb.UIOSelectorList(inUIOSelectorStr = lUIOSelectorStr)[0]
UIOClick(inUIO = lUIO)
UIWeb.BrowserClose()
:param inUIO: UIO элемент. Получить его можно с помощью функций UIOSelectorList или UIOSelectorFirst
:type inUIO: WebElement
"""
inUIO.click()
def UIOSelectorHighlight(inUIOSelectorStr: str, inIsFirst:bool=False, inDurationSecFloat:float=3.0, inColorStr:str="green"):
"""L+,W+: Выполнить подсвечивание UI элемента с селектором inUIOSelectorStr.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
UIWeb.UIOSelectorHighlight(inUIOSelectorStr = lUIOSelectorStr)
UIWeb.BrowserClose()
:param inUIOSelectorStr: XPATH или CSS селектор UI элемента на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath
:type inUIOSelectorStr: str
:param inIsFirst: True - подсветить только первый элемент, который удовлетворяет селектору. По умолчанию False
:type inIsFirst: bool, опционально
:param inDurationSecFloat: Длительность подсвечивания. По умолчанию 3.0 сек.
:type inDurationSecFloat: float, опционально
:param inColorStr: Цвет подсвечания Варианты: "red", "blue", "grey", "yellow". По умолчанию "green" (зеленый)
:type inColorStr: str, опционально
"""
global gBrowser
if inIsFirst == True:
2 years ago
lUIOList = [UIOSelectorFirst(inUIOSelectorStr=inUIOSelectorStr)]
lJSStr = \
2 years ago
f"var lElementList = arguments[0];" \
f"if (lElementList.length>0) {{ lElementList=[lElementList[0]]; }}" \
f"for (var lIndexInt=0; lIndexInt<lElementList.length;lIndexInt++) {{" \
f" lElement=lElementList[lIndexInt];" \
f" lElement.ORPABackupStyleOutline = lElement.style[\"outline\"];" \
f" lElement.style[\"outline\"]=\"2px solid {inColorStr}\";" \
f"}}" \
f"window.ORPAOutlineList = lElementList;"
2 years ago
PageJSExecute(lJSStr, lUIOList)
else:
2 years ago
lUIOList = UIOSelectorList(inUIOSelectorStr=inUIOSelectorStr)
lJSStr = \
2 years ago
f"var lElementList = arguments[0];" \
f"for (var lIndexInt=0; lIndexInt<lElementList.length;lIndexInt++) {{" \
f" lElement=lElementList[lIndexInt];" \
f" lElement.ORPABackupStyleOutline = lElement.style[\"outline\"];" \
f" lElement.style[\"outline\"]=\"2px solid {inColorStr}\";" \
f"}}" \
f"window.ORPAOutlineList = lElementList;"
2 years ago
PageJSExecute(lJSStr, lUIOList)
time.sleep(inDurationSecFloat)
lJSStr = \
f"var lElementList = window.ORPAOutlineList;" \
f"for (var lIndexInt=0; lIndexInt<lElementList.length;lIndexInt++) {{" \
f" lElement=lElementList[lIndexInt];" \
f" lElement.style[\"outline\"]=lElement.ORPABackupStyleOutline;" \
f"}}" \
f"delete window.ORPAOutlineList;"
PageJSExecute(inJSStr=lJSStr)
def UIOSelectorClick(inUIOSelectorStr: str):
"""L+,W+: Выполнить нажатие по элементу с селектором inUIOSelectorStr.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
UIWeb.UIOSelectorClick(inUIOSelectorStr = lUIOSelectorStr)
UIWeb.BrowserClose()
:param inUIOSelectorStr: XPATH или CSS селектор UI элемента на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath
:type inUIOSelectorStr: str
"""
if UIOSelectorDetect(inUIOSelectorStr=inUIOSelectorStr) == "CSS":
PageJSExecute(inJSStr=f"document.querySelector('{inUIOSelectorStr}').click()")
else:
PageJSExecute(inJSStr=f"document.evaluate('{inUIOSelectorStr}', document, null , XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click()")
def UIOSelectorSetValue(inUIOSelectorStr: str, inValue: str):
"""L+,W+: Установить значение элемента с селектором inUIOSelectorStr.
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://www.google.com/")
lUIOSelectorStr = "/html/body/div[1]/div[3]/form/div[1]/div[1]/div[1]/div/div[2]/input"
lValue = "pyOpenRPA"
UIWeb.UIOSelectorSetValue(inUIOSelectorStr = lUIOSelectorStr, inValue = lValue)
UIWeb.BrowserClose()
:param inUIOSelectorStr: XPATH или CSS селектор UI элемента на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath
:type inUIOSelectorStr: str
:param inValue: Значение, которое необходимо установить
:type inValue: str
"""
if UIOSelectorDetect(inUIOSelectorStr=inUIOSelectorStr) == "CSS":
PageJSExecute(inJSStr=f"document.querySelector('{inUIOSelectorStr}').value='{inValue}'")
else:
PageJSExecute(inJSStr=f"document.evaluate('{inUIOSelectorStr}', document, null , XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.value='{inValue}'")
def UIOSelectorWaitAppear(inUIOSelectorStr:str, inWaitSecFloat:float=UIO_WAIT_SEC_FLOAT, inWaitIntervalSecFloat:float = UIO_WAIT_INTERVAL_SEC_FLOAT):
"""L+,W+: Ожидать появление UI элемента на веб странице (блокирует выполнение потока), заданного по UIO селектору inUIOSelectorStr. Выполнять ожидание на протяжении inWaitSecFloat (по умолчанию 60 сек.). Проверка производится с интервалом inWaitIntervalSecFloat (по умолчанию 1 сек.)
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lAppearUIOList = UIWeb.UIOSelectorWaitAppear(inUIOSelectorStr = lUIOSelectorStr)
UIWeb.BrowserClose()
:param inUIOSelectorStr: XPATH или CSS селектор UI элемента на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath
:type inUIOSelectorStr: str
:param inWaitSecFloat: Время ожидания на исчезновение UI элемента, по умолчанию UIO_WAIT_SEC_FLOAT (60 сек)
:type inWaitSecFloat: float, опциональный
:param inWaitIntervalSecFloat: Интервал проверки исчезновения, по умолчанию UIO_WAIT_INTERVAL_SEC_FLOAT (1 сек)
:type inWaitIntervalSecFloat: float, опциональный
:raises Exception: Время ожидания превышено
:return: Список UI элементов, которые удовлетворяют селектору и появились на странице
:rtype: list
"""
lStartSecFloat = time.time()
lResultList=[]
while time.time() - lStartSecFloat < inWaitSecFloat:
lResultList = UIOSelectorList(inUIOSelectorStr=inUIOSelectorStr)
if len(lResultList)>0: break
time.sleep(inWaitIntervalSecFloat)
if time.time() - lStartSecFloat > inWaitSecFloat: raise Exception(f"Wait time is over. No element has been appear")
return lResultList
def UIOSelectorWaitDisappear(inUIOSelectorStr:str, inWaitSecFloat:float=UIO_WAIT_SEC_FLOAT, inWaitIntervalSecFloat:float = UIO_WAIT_INTERVAL_SEC_FLOAT):
"""L+,W+: Ожидать исчезновение UI элемента с веб страницы (блокирует выполнение потока), заданного по UIO селектору inUIOSelectorStr. Выполнять ожидание на протяжении inWaitSecFloat (по умолчанию 60 сек.). Проверка производится с интервалом inWaitIntervalSecFloat (по умолчанию 1 сек.)
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
UIWeb.UIOSelectorWaitDisappear(inUIOSelectorStr = lUIOSelectorStr)
UIWeb.BrowserClose()
:param inUIOSelectorStr: XPATH или CSS селектор UI элемента на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath
:type inUIOSelectorStr: str
:param inWaitSecFloat: Время ожидания на исчезновение UI элемента, по умолчанию UIO_WAIT_SEC_FLOAT (60 сек)
:type inWaitSecFloat: float, опциональный
:param inWaitIntervalSecFloat: Интервал проверки исчезновения, по умолчанию UIO_WAIT_INTERVAL_SEC_FLOAT (1 сек)
:type inWaitIntervalSecFloat: float, опциональный
:raises Exception: Время ожидания превышено
"""
lStartSecFloat = time.time()
while time.time() - lStartSecFloat < inWaitSecFloat:
lResultList = UIOSelectorList(inUIOSelectorStr=inUIOSelectorStr)
if len(lResultList)==0: break
time.sleep(inWaitIntervalSecFloat)
2 years ago
if time.time() - lStartSecFloat > inWaitSecFloat: raise Exception(f"Wait time is over. No element has been disappear")
from lxml import etree
from io import StringIO
gXML = etree.parse(StringIO('<foo><bar></bar></foo>'))
def UIOSelectorDetect(inUIOSelectorStr:str) -> str:
"""L+,W+: Идентифицировать стиль селектора (CSS или XPATH)
2 years ago
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
lUIOSelectorStr = "#grid > div.grid-middle > div.grid__main-col.svelte-2y66pa > div.grid_newscol.grid_newscol__more-pulse.svelte-1yvqfic > div.grid__ccol.svelte-1yvqfic > ul > li:nth-child(5) > div > a"
lUIOSelectorStr = "//*[@id=\'grid\']/div[2]/div[2]/div[3]/div[1]/ul/li[5]/div/a"
lResultStr = UIWeb.UIOSelectorDetect(inUIOSelectorStr = lUIOSelectorStr)
:param inUIOSelectorStr: XPATH или CSS селектор UI объекта на web странице. Подсказки по CSS: https://devhints.io/css Подсказки по XPath: https://devhints.io/xpath
2 years ago
:type inUIOSelectorStr: str
:return: "CSS" или "XPATH"
:rtype: str
"""
global gXML
lResultStr = "CSS"
try:
gXML.xpath(inUIOSelectorStr)
lResultStr = "XPATH"
except etree.XPathEvalError as e:
lResultStr = "CSS"
return lResultStr
def UIOMouseSearchInit():
"""L+,W+: Инициализирует процесс поиска UI элемента с помощью мыши. Для прекращения поиска необходимо использовать функцию: UIOMouseSearchReturn
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
import time
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
UIWeb.UIOMouseSearchInit()
time.sleep(3)
UIWeb.UIOMouseSearchReturn()
UIWeb.BrowserClose()
"""
2 years ago
lJSStr = """
document.ORPASearch = function(e){
document.ORPAMouseXInt = e.clientX;
document.ORPAMouseYInt = e.clientY;
}
document.addEventListener('mousemove', document.ORPASearch, {
passive: true})
"""
PageJSExecute(lJSStr)
def UIOMouseSearchReturn():
"""L+,W+: Возвращает UIO объект, над которым находится указатель мыши. Предварительно должна быть вызвана функция UIWeb.UIOMouseSearchInit
!ВНИМАНИЕ! Для работы необходимо проинициализировать webdriver
.. code-block:: python
# UIWeb: Взаимодействие с ui web
from pyOpenRPA.Robot import UIWeb
import time
UIWeb.BrowserChromeStart()
UIWeb.PageOpen("https://mail.ru")
UIWeb.UIOMouseSearchInit()
time.sleep(3)
UIWeb.UIOMouseSearchReturn()
UIWeb.BrowserClose()
:return: UIO объект
:rtype: webelement
"""
2 years ago
lJSStr = """
document.removeEventListener('mousemove', document.ORPASearch);
return document.elementFromPoint(document.ORPAMouseXInt,document.ORPAMouseYInt);
"""
try:
return PageJSExecute(lJSStr)
except JavascriptException: raise JavascriptException("Отсутствуют координаты для идентификации веб-элемента. Пожалуйста, в следующий раз двигайте мышью")
2 years ago