Рубрики
Без рубрики

Python и Selenium для профиля Salesforce

API метаданных был слишком похожий на хитрость. Помечено с помощью Salesforce, Учебник, Python, Selenium.

Я нуждался в свежем профиле Salesforce «Нет разрешений» в зрелом ORG.

Я не мог получить API метаданных, работаю достаточно быстро, чтобы мой понравился, поэтому я сдался и построил «робот-версию» себя с Python и Selenium, угнал моего собственного браузера, и смотрел подделку – я щелкнул тысячи кнопок на скорости компьютера Отказ

(Это делает мой компьютер сама #awesomeadmin?)

Вот как я это сделал.

Фон

Я собираюсь проверить совершенно новый Орежняя среда Pardot Я был выдан, и я хочу подключить его к Saleforce Sandbox под философией наименее привилегии .

Это означает создание профиля Salesforce с нет Доступ к уровню объекта CRUD и нет Доступ к читаю/запись уровня поля.

Я перевернув вещи назад на Если мне нужен.

К сожалению, у нас нет таких профилей к клону.

  • Я клонировал ближайший, который я мог найти – «только прочитать» один – но он накопил много чтения/редактирования (Да, редактировать, несмотря на его имя) Доступ ему не нужен.
  • Чтобы получить его к статусу «Нет разрешений», я хотел бы иметь Лот изданий, чтобы сделать.

Читайте дальше, чтобы увидеть, что я пытался.

Возьмите 1: Welkin Suite

Я думал, что Selkin Suite’s Редактор разрешений объектов а также Безопасность уровня поля Инструменты могли помочь мне.

  • Действительно, редактор разрешений объектов сделал быструю работу с выключением доступа уровня объекта CRUD.
  • Тем не менее, это было слишком много щелчков, и слишком много ожидает, чтобы подтянуть сотни объектов по одному на вкладке «Уровень безопасности на уровне поле Welkin» и отключите вещи от объекта-объекта.
    • Редактор отлично подходит для удаления молотка и обнуления разрешений для профиля или нескольких на 5 объектов. Однако он все еще был слишком большой работой на 150 объектов.

Взять 2: API метаданных

Я думал:

” Уэлкин, а также авторы Salesforce Setup Page, имеют как созданные инструменты, которые запрашивают Salesforce Security Security Share для объекта, чтобы представить их пользователям.

«Я просто запрашиваю все, что они запрашивают и циклируют над ним, наращивание гумозных данные Pardot Sync.profile в XML , Молни это, и Разверните его в свою песочницу в Workbench

Содержание Pardot Data Sync.profile будет выглядеть так:



    
        false
        false
        SomeObjectAPIName.SomeFieldAPIName
        true
        false
    
    ...
    
        false
        false
        SomeObjectAPIName.SomeFieldAPIName
        true
        false
    

Этот файл будет внутри папки в .zip под названием «Профили».

На верхнем уровне .zip будет называться файлом Package.xml со следующим содержанием:



    MiscLazyStuff
    
        Pardot Data Sync
        Profile
    
    46.0

Я не знал, как получить список Какой-тоobjectapiname. Некоторыефилдапинама Значения, чтобы построить мой ... Обелки вокруг, поэтому я начал с написания сценария Python в цикл через каждый * .Object XML-файл Я скачал на мой компьютер с Welfink.

К сожалению, я бежал в нет конца Развертывание метаданных Ошибки – каждый из которых я мог видеть только один из одновременно.

  1. Сначала мне пришлось редактировать свой скрипт, чтобы игнорировать поля формулы
  2. Тогда мне пришлось редактировать его, чтобы игнорировать мастер-деталь поля
  3. Тогда мне пришлось редактировать его, чтобы игнорировать обязательные поля поиска. А Требуется Свойство не существует на стандартных полях стандартных объектов в .Object Файлы, чтобы быть в безопасности, я просто проигнорировал все поля поиска, у которых не было Требуется флаг в любом случае. \
  4. И, конечно, мне пришлось игнорировать поля с Требуется Собственность правда Отказ
  5. Но все же, были более стандартные поля стандартных объектов, которые были необходимы, не сказав мне так в их * .Object Определения XML. Я выбежал из терпения, когда сообщения об ошибках сказали мне, что Разрешение разрешения. СогласиеПоптиртовоедатетиме был обязан, но его код в АвторизацияFormConsent.Object Похоже:

    ConsentCapturedDateTime
    false

Подожди … Как я должен был знать, что о СогласиеПоптиртовоедатетиме Удар

Где это задокументировано/извлекается ?? !! **

Я провел еще 3 часа, ударяя голову против стены, играющую на инструментальную API и вершину, пытаясь найти надежный способ получить тот же тип «Не беспокойтесь с этим полем» BlackList (или «беспокоиться с этими полями» Белом) То, что Selkin Suite и авторы веб-страниц настроек Salesforce для веб-сайтов, очевидно, удалось придумать, прежде чем я бросил.

Я имею в виду, я должен был написать Scrape Документация Для слова «требуется» в начале «описания» абзаца или что-то?

В определенный момент я был сделано Отказ

Примечание : Приму вклад!

Уэлкинские люди, сотрудники Salesforce или другие разработчики – я хотел бы услышать, какие алгоритмы вы Выяснить Что именно Поля, чтобы представить пользователям как разрешение – редактируемый.

До тех пор … вместо того, чтобы построить свою собственную машину, я решил «там я исправил это» колесо предкистительной машины. Ведущий мне …

Взять 3: MENUE SETUP + SELENIUM (и немного погрузчика данных)

Селен Это программируемый набор программного обеспечения, который действует как промежуточное программное обеспечение между вашим веб-браузером и языком программирования по вашему выбору.

Как правило, разработчики используют его, чтобы имитировать пользовательские кнопки на нажатии на веб-страницу, чтобы они могли работать, чтобы их веб-страница работает как предназначена.

  • Компьютеризация сохраняет хлопот – кто действительно хочет нажать на все кнопки, которые необходимо нажать, когда это то же самое время каждый раз?
  • Компьютеризация весы хорошо – это надежный способ моделирования миллионов людей, нажав на вашу веб-страницу одновременно (вроде бы, если вы гигантский э-розничный продавец во время крупных торговых праздников Seasons) Отказ

Я установил его, потому что я знал, что мне нужно «Определить» где-то между Несколько и Сотни Флажок на нами экран на десятки до сотен страниц настроек Salesforce, которые были полностью, как друг друга.

Похоже, как идеальное использование для автоматизации моей работы!

Я мог бы исследовать, какой мой веб-браузер делал от моего имени, поскольку я нажал на первые несколько кнопок, а затем учить компьютеру сделать это для меня, и научить компьютеру, какие тонкие вариации должны были объяснить при переключении с одного Salesforce «Объект» к другому.

Шаг 1: Бревно В

Во-первых, я провел следующий код Python

from selenium.webdriver import Chrome
browser = Chrome(executable_path='C:\\exampleprograms\\ChromeDriver\\chromedriver.exe')
browser.get('https://test.salesforce.com')

Это вызвало особый экземпляр Chrome для появления на моем компьютере.

Я вошел в Salesforce с моим именем пользователя и паролем как обычно.

Шаг 2: Получить мои объектные ссылки

Тогда я прокомментировал код выше и, не позволяя Мой Python IDe очистить значение браузер Переменная (что это нормальное поведение моего IDE из одной кнопки «RUN», нажмите к следующему) Я провел следующий код:

editableLinksToVisit = []
browser.get('https://cs99.salesforce.com/00eX00000000XXX?s=ObjectsAndTabs')
objtable = browser.find_element_by_css_selector("[id$='table_objects_and_tabs:tb']")
rows = objtable.find_elements_by_xpath('.//*')
for row in rows:
    tds = row.find_elements_by_tag_name("td")
    if len(tds) > 2:
        td1 = tds[0]
        td2 = tds[1]
        td2span = td2.find_element_by_tag_name("span")
        if td2span is not None and td2span.text != '--':
            td1span = td1.find_element_by_tag_name("span")
            if td1span is not None:
                td1a = td1span.find_element_by_tag_name("a")
                if td1a is not None:
                    td1aText = td1a.text
                    td1aLink = td1a.get_attribute('href')
                    td1aEditableLink = td1aLink.replace('?s=ObjectsAndTabs','/e?s=ObjectsAndTabs')
                    editableLinksToVisit.append({'text':td1aText, 'editLink':td1aEditableLink})

Вот что делает код выше:

  1. Browser.get () Команда заставила меня посетить новый веб-сайт в Chrome – как будто я сам набрал этот URL в мою панель браузера и нажмите «Enter».

    • Это довольно триппи – Вы буквально следили за своим компьютером, делаете вещи без вас, подобно кому-то еще, управлял контролем.
  2. URL я сказал Browser.get () О том, что URL-адрес экрана «Объектов и вкладок» настроек для профиля, который я пытался редактировать (который я написал здесь как имеющий идентификатор объекта 00ex00000000xxx ) Отказ
  3. Когда я бегу Browser.get () Содержимое хранится в моей программе браузер Переменные изменения.
  4. Тогда я использую различные Методы встроен в тип данных Я хранил в браузер (Я точно забыл, что это такое) такие как .find_element_by_css_selector () и .find_element_by_tag_name. () к Scrape содержимое этой конкретной веб-страницы.

    • Технически, я соскорью DOM, или то, что вы видите, когда вы используете Console Developer Console Firefox или Chrome или Chrome, не соскабливая источник HTML. Их содержимое всегда – немного по-другому. Раньше было то, что вы могли бы сказать, какой HTML составлял страницу, просто посмотрев на его источник. В наши дни JavaScript может «ввести» HTML в «DOM» в последнюю минуту, и ваш браузер на самом деле Делает веб-страницу на основе DOM, поэтому вы должны знать, как проверить, что на самом деле в DOM, если вы хотите разобрать код за веб-страницей.
  5. Мой большой для петля и гнездо Если Заявления ищет ссылки в конкретной таблице на странице, которые являются не рядом с текстом “-“.

    • «-» будет указывать, что ссылка идет на настройки для вкладки, а не объекта, поэтому я хочу пропустить тех.
  6. Тогда я возьму имя объекта (на текст ссылки) и его URL.
  7. Наконец, я редактирую ссылку, придерживаясь /E. прямо до ? s= Таким образом, я могу пойти прямо в редактируемую версию страницы конфигурации профиля этого объекта, когда я посещаю мою ссылку.

Мой большой список имен объектов и их ссылки – это то, что я храним как EditableLinkstovisit Отказ

Шаг 3: Нажмите на все кнопки

Я снова прокомментировал код выше и, не позволяя моим Python IDE выяснить значение любых переменных (что это нормальное поведение моего IDE из одной кнопки «RUN», нажмите к следующему) схватил чашку воды и провел следующий код (Это заняло около 15-25 минут ) :

for linkDict in editableLinksToVisit:
    print(linkDict.get('text'))
    browser.get(linkDict.get('editLink'))

    submitbutton = browser.find_element_by_css_selector("input[type='submit'][value='Save'][id$='button_pc_save']")
    editinputs = browser.find_elements_by_css_selector("input:enabled:checked[id$=':fls_edit_ck']")
    readinputs = browser.find_elements_by_css_selector("input:enabled:checked[id$=':fls_read_ck']")

    if submitbutton is not None and (len(editinputs) + len(readinputs) > 0):
        print('submit ' + str(submitbutton is not None))
        print('edits ' + str(len(editinputs)))
        print('reads ' + str(len(readinputs)))
        for ipt in editinputs:
            ipt.send_keys(" ")
        for ipt in readinputs:
            ipt.send_keys(" ")
        submitbutton.send_keys("\n")
        print('done')
    else:
        print('oops')
        print('submit ' + str(submitbutton is not None))
        print('edits ' + str(len(editinputs)))
        print('reads ' + str(len(readinputs)))

Этот код – большой цикл по всему пару ссылки URL-адреса URL ( кортежи ) Я бы спасил в EditableLinkstovisit Отказ

Вот что он делает для каждой ссылки в списке:

  1. Это пишет вниз по примечанию, которую я могу прочитать, рассказывая мне, какой объект должен быть вообще, чтобы угонировать, мой браузер, чтобы посетить URL
  2. Он угнатит мой браузер и посещает этот URL.
  3. Это читает код домо Page, чтобы найти все Полевой уровень безопасности Ящики, которые в настоящее время проверяются, и это не изменяемым.

    • Это делает это в отдельных «редактировать» и «прочитать» списки флажков.
  4. Он считывает код DOM страницы, чтобы найти кнопку Сохранить.
  5. Если он нашел что-то, что «может использовать ООН-проверку», – оно цикла по спискам и не проверяет поля.
    • Я петлю в первую очередь «редактирование», затем «читает», так как флажки «чтение« чтение »может иметь побочный эффект от проверки« редактирование »боковых ящиков. И я хотел держать вещи простыми и не беспокоиться о побочных эффектах.
    • Я использую имитацию удара пробела после «табуляции» на флажок с клавиатурой, а не выделять () команда, потому что выделять ()
  6. не работал надежно, а кто-то на стековерфле говорил, что это может И они были правы. 🤷 Он нажимает кнопку Сохранить (Опять же, я имитирую это, практически ударяя «ввод» на клавиатуре, а не, нажав, потому что по какой-то причине это работало более надежно)

Это немного завораживает, чтобы посмотреть (Примечание – анимация ниже) :

Во всяком случае, на несколько минут.

Pro Tip: Не запускайте его, когда вы уже остаетесь поздно в офисе, и действительно просто хотите выключить компьютер и наслаждаться прекрасным вечером. 🌅

Шаг 4: Очистить с помощью Data Loader

Кампания И несколько других объектов имеют редактируемые разрешения, но не отображались как редактируемые через веб-панель, поэтому я нашел их, извлекая этот запрос с помощью Salesforce Data Loader :

SELECT Id, Field, SObjectType, PermissionsRead, PermissionsEdit
FROM FieldPermissions 
WHERE parentId IN ( SELECT id 
                    FROM permissionset 
                    WHERE PermissionSet.Profile.Name = 'Pardot Data Sync')
AND (PermissionsRead = true or PermissionsEdit = true)

Я использовал Excel, чтобы перевернуть «PermissionsRead» и «PermissionsEdit», чтобы ложь весь путь вниз по обею колонны.

Тогда, в двух проходах – опять же, делая «редактировать» сначала и «прочитать» второй (То есть я сопоставил «идентификатор» оба раза, но только сопоставил один столбец, который я хотел редактировать одновременно) с моими настройками загружать всего 1 запись за раз (Итак, одна ошибка не выключит пакет) Я передал эту электронную таблицу в операции обновления в погрузчике данных.

Это также заняло несколько минут (Опять же, помните, 1 запись одновременно) , но в конце концов он прошел.

Не производственное решение

Это не устойчивое в качестве долгосрочного решения для создания профиля «Zero».

Загрузка через API метаданных намного больше кошер И, вероятно, может быть сделано все за один шаг, вместо того, чтобы придираться к загрузчику данных для «очистки».

Кроме того, я даже не очень уверен I сделал Получите все условия безопасности на уровне полевых уровней, которые я мог бы выключить.

Я хотел бы быть более тщательным в будущем и по-настоящему набором разрешений, как я Предполагается Отказ

  • Q: У кого-нибудь есть подсказки для строительства Идеально Список объектов и полей для записания разрешений для A .Profile файл?

Оригинал: “https://dev.to/katiekodes/no-permissions-salesforce-profile-w-python-and-selenium-2fc7”