Эффективность скрипта веб-автоматизации - PullRequest
1 голос
/ 04 февраля 2020

Я написал очень длинный код для автоматизации просмотра веб-страниц. Как показано на рисунке, он состоит из 51 блока кода, состоящего из 50 строк кода в каждом. Мне нужно запускать этот скрипт более одного раза, но каждый раз, когда я его запускаю, все эти 51 блок требуют небольшой настройки. На данный момент я делаю небольшую настройку вручную, но должен быть способ сжать мой код и упростить его запуск несколько раз.

В каждом из этих блоков только 4 строки, которые распределены внутри блок кода нужно изменить. Есть ли способ «обернуть» остальную часть кода в какую-то функцию, позволяя себе просто набрать 4 строки вручную, применив ли это ко всем 51 блокам?

enter image description here

Вот пример одного из красных блоков (рисунок) кода:

driver = webdriver.Chrome()
driver.maximize_window()
driver.get("website")
driver.find_element_by_id("email").send_keys("email@email.com")
driver.find_element_by_id("password").send_keys("password123")
driver.find_element_by_id("submit").click()
driver.get("website2")
driver.implicitly_wait(30)
driver.find_element_by_id("ui-id-6").click()
day = driver.find_element_by_xpath("/html/body/main/div[2]/div[6]/div[3]/div[4]/div/div[2]/table/tbody/tr[1]/td[2]")
ActionChains(driver).move_to_element(day).click().perform()
WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH,"/html/body/main/div[2]/div[6]/div[3]/div[4]/div/div[2]/table/tbody/tr/td/ul/li[2]/h3/a[3]")))
driver.execute_script("window.scrollBy(0,500)","")

driver.find_element_by_xpath('/html/body/main/div[2]/div[6]/div[3]/div[4]/div/div[2]/table/tbody/tr/td/ul/li[2]/h3/a[3]').click()

driver.find_element_by_xpath('/html/body/main/div[2]/div[6]/div[3]/div[2]/form/div[3]/ul[1]/li[3]/i').click()
driver.find_element_by_xpath('/html/body/main/div[2]/div[6]/div[3]/div[2]/form/div[3]/ul[1]/li[2]/i').click()
driver.find_element_by_xpath('/html/body/main/div[2]/div[6]/div[3]/div[2]/form/div[3]/ul[1]/li[1]/i').click()
driver.find_element_by_id('scheduleDate').click()
day = driver.find_element_by_xpath('/html/body/div[4]/table/tbody/tr[5]/td[2]/a')
ActionChains(driver).move_to_element(day).click().perform()
driver.implicitly_wait(30)
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
img = driver.find_element_by_xpath('/html/body/main/div[2]/div[6]/div[3]/div[2]/form/div[2]/div/div[3]/div[1]/button[2]')
ActionChains(driver).move_to_element(img).click().perform()
driver.find_element_by_xpath('/html/body/main/div[2]/div[6]/div[4]/div/div[2]/div/ul/li/div[1]/img').click()
driver.execute_script('window.scrollTo(0, 500)')

driver.find_element_by_id("quickpostHashTag").send_keys("tags",(Keys.RETURN))

driver.find_element_by_id("calendarTitle").clear()

driver.find_element_by_id('calendarTitle').send_keys('title')

driver.find_element_by_id('calendarMessage').clear()

driver.find_element_by_id('calendarMessage').send_keys("msg")

driver.implicitly_wait(30)
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
driver.find_element_by_xpath('/html/body/main/div[2]/div[6]/div[3]/div[2]/form/div[4]/a').click()
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')
driver.find_element_by_xpath("/html/body/main/div[2]/div[6]/div[3]/div[2]/div/div[3]/div/button[1]").click()
driver.close()

Строки, которые изменяются каждый раз, когда я запускаю это - тот, который разделен пробелами сверху и снизу, а затем те, что с «тегами», «заголовком» и «сообщениями»

1 Ответ

1 голос
/ 04 февраля 2020

Это действительно зависит от того, что делают эти 4 строки, если честно, и от того, как они влияют на остальную часть логики. c.

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

Как только вы сможете отделить 4 строки от остальной части кода, создайте структуру, похожую на список / dict / объект, в зависимости от того, что лучше подходит для вашего случая, чтобы добавить это «4 строки кода», отличающиеся от каждого из 50-51 блоков, которые у вас есть, и, в конечном итоге, перебирают указанную структуру и вызывают уже выведенный из предыдущих шагов блок кода, предоставляя 4 строки содержимого из указанной итерации.

TL; DR:

  • разделить 4 строки от остальных block

  • остальная часть блока становится автономной функцией (назовем ее execute_process)

  • , чтобы 4 строки были либо функцией, либо параметрами для остальная часть блока

  • создает структуру (list / dict / obj), охватывающую возможности для 4 строк кода -> давайте назовем это process_params

  • итерация по указанной структуре и передача каждого из process_param из созданного process_params в execute_process

    ** Теперь у вас есть только 47 строк кода в функции, и структура, охватывающая 4 строки с каждой возможной конфигурацией для них.

Пример: Итак, у вас есть XPATH и 3 идентификатора, которые меняются? Вы можете легко создать список словарей, например, в котором вы будете хранить значения для строк, которые меняются, и добавить оставшуюся часть кода в функцию, принимая эти 4-5 параметров. После этого просто переберите указанный список словарей и вызовите функцию, используя доступные данные.

for data_feed in test_scenarios:
    execute_test(xpath=data_feed["xpath"],
                 tags=data_feed["tags"],
                 title=data_feed["title"],
                 msg=data_feed["msg"])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...