【问题标题】:Web automation script efficiencyWeb自动化脚本效率
【发布时间】:2020-02-04 23:03:12
【问题描述】:

我写了一个非常长的代码来自动化一些网页浏览。它由 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()

每次运行时都会发生变化的行是 - 由顶部和底部的空格分隔的行,然后是带有“标签”、“标题”和“消息”的行

【问题讨论】:

  • 如果没有至少一些示例,可能无法回答您的代码的简化示例。
  • 我添加了其中一个重复 51 次的代码块。之后,我需要为每个代码块 (51) 更改这 4 行并再次运行。

标签: python selenium webautomation


【解决方案1】:

老实说,这实际上取决于这 4 行在做什么,以及它们如何影响其余逻辑。

无论哪种方式,您都可以尝试使用参数将这些代码行(变量赋值或函数调用,无论它们可能是什么)外部化,因此请尝试找出这 4 行需要哪些参数,或者它们本身是否被使用在其余代码块中,将其其余部分外部化为接受与 4 行代码对应的参数的函数。

一旦您能够从其余代码中拆分 4 行代码,请创建一个类似于列表/字典/对象的结构,以更适合您的情况,在其中添加与每个代码不同的“4 行代码”您拥有的 50-51 个块,并最终迭代所述结构并调用已从先前步骤外部化的代码块,提供所述迭代的 4 行内容。

TL;DR:

  • 从块的其余部分拆分 4 行

  • 块的其余部分成为独立函数(我们称之为execute_process

  • 将 4 行设为块其余部分的函数或参数

  • 创建一个包含 4 行代码可能性的结构 (list/dict/obj) -> 我们称之为 process_params

  • 遍历所述结构并将每个process_param从创建的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"])

【讨论】:

  • 所以每个代码块(有 51 个块)是一组步骤,我希望 Selenium 在该网站上完成的确切步骤 - 51 次。之后,我需要再次运行该程序,但现在我需要在 51 个块中的每个块中更改 4 行以使其适用于这个新任务。
  • 完全正确,因此您可以迭代一个函数来执行该代码块的工作,而每次对这 3-4 行代码使用不同的值
  • 那么您有一个 XPATH 和 3 个正在更改的 ID?您可以轻松地创建一个字典列表,例如,您可以在其中保存正在更改的行的值,并将其余代码添加到函数中,接受这 4-5 个参数。之后,只需遍历所述字典列表并使用可用数据调用该函数。 ` 用于 test_scenarios 中的 data_feed:execute_test(xpath=data_feed["xpath"], tags=data_feed["tags], title=data_feed["title], msg=data_feed["msg]) `
  • 实际上 51 个块中的每个块代码都有 51 个不同的 xpath。这 3 个 ID 在 51 个块中是不变的。这51个代码块就是我的程序,我需要多次运行这个程序。我的问题是我不想遍历程序中的这 51 个块,每个块由 60 行代码组成,每次我需要再次运行它,但需要添加 3 行新代码。
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
  • 2010-12-11
  • 2013-08-16
  • 2016-12-02
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多