我写了一段非常长的代码来自动化一些网页浏览。它由51个代码块组成,每个代码块由50行代码组成,如图所示。我需要多次运行这个脚本,但每次运行它时,这51个代码块都需要进行一些小调整。到目前为止,我手动进行了小调整,但必须有一种方法来压缩我的代码,使其更容易多次运行。
在每个代码块中,只需要更改代码块中展开的4行代码。有没有一种方法可以将剩下的代码“包装”在某个函数中,同时让自己可以选择只需手动输入4行代码,然后将其应用到所有51个代码块中?

下面是红色代码块(图片)之一的示例:
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()每次运行此命令时,更改的行是-由空格从顶部和底部分隔的行,然后是带有“tag”、“title”和“msg”的行。
发布于 2020-02-04 22:24:25
老实说,这取决于这4行代码在做什么,以及它们对其余逻辑的影响。
无论哪种方式,您都可以尝试使用参数将这些代码行(变量赋值或函数调用,无论它们是什么)外部化,因此尝试找出这4行代码需要哪些参数,或者如果在代码块的其余部分中使用这些参数,则将其其余部分外部化为一个接受与这4行代码对应的参数的函数。
一旦您能够将4行代码从其余代码中拆分出来,创建一个类似于列表/字典/对象的结构,其中添加与您拥有的50-51个代码块中的每一个不同的"4行代码“,并最终迭代上述结构并调用前面步骤中已外部化的代码块,提供4行内容形式的迭代。
TL;DR:
将4行代码从块的其余部分中拆分出来,使块的其余部分成为独立的函数(让我们将其称为4行函数或块其余部分的参数)
/
)让我们将其称为process_params
process_params中的每个对象提供给execute_process**现在您在一个函数中只有47行代码,并且包含4行代码的结构以及它们的每个可能的配置。
示例:那么您有一个XPATH和3个正在更改的ID?例如,您可以轻松地创建一个字典列表,在其中保存正在更改的行的值,并在函数中添加剩余的代码,接受这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"])https://stackoverflow.com/questions/60059117
复制相似问题