【问题标题】:How to do multiple substitution using perl scripts如何使用 perl 脚本进行多次替换
【发布时间】:2020-06-05 22:02:09
【问题描述】:

我有一堆脚本想要替换一些文本。

上下文:我们将 selenium 用于 UI 自动化。我们曾经将 UiElements 的引用存储在地图中。但是我们现在开始使用 PageFactory(一个将所有 UiElements 声明为字符串的类) 因此,当我们使用地图时,我们必须将 UI 元素调用为 objectMap.getIdentifier("navigate.leftsidebar")。但是现在有了 PageFactory(它就像实例化一个对象,并且 UIElements 被声明为一个字符串),我可以访问这些 UIelements objectPageFactory.navigate_leftsidebar(这里 navigate_leftsidebar 是一个字符串)

所以我需要修改所有现有的脚本。有没有办法我可以编写一个脚本来替换它,而不是手动执行? 以下是我将遇到的 3 个场景:

  1. Click(getElement(objectMap.getIdentifier("navigate.leftsidebar").replace("$Page", "Inbox")), "点击一个元素");
  2. objectMap.getIdentifier("navigate.leftsidebar")
  3. Click(objectMap.getIdentifier("navigate.leftsidebar"), "点击一个元素");

这是预期的输出:

  1. Click((objectPageFactory.navigate_leftsidebar("Inbox")), "点击一个元素");

  2. objectPageFactory.navigate_leftsidebar

  3. Click(objectPageFactory.navigate_leftsidebar, "点击一个元素");

变化是:

  1. “objectMap”被重命名为“objectPageFactory” 可能有不同类型的地图。如果是 objectMap ,则应替换为 objectPageFactory;如果是loginMap,应该改成loginPageFactory

  2. objectMap.getIdentifier("navigate.leftsidebar") >>>> objectFactory.navigate_leftsidebar(括号内的String字面量用下划线而不是点分隔

  3. 现在不需要getElement

  4. 我们曾经有一些动态的 UiElements(在这种情况下是 navigate.leftsidebar),我们曾经为此调用 String.replace,现在我们正在编写将在内部执行 String.format 的函数 getElement(objectMap.getIdentifier("navigate.leftsidebar").replace("$Page", "Inbox")) >>>>> objectPageFactory.navigate_leftsidebar("Inbox")

我从这个链接获得了一个 perl 脚本,它将完成部分工作 sed command to replace dots。 我只需要为此添加不同的场景,有没有办法?输出现在也应该有一个 pageFactory 文本,基于哪个地图

#! /usr/bin/perl

use strict ;

sub fix { $_ = shift ; s/"//g ; s/\./_/g ; return $_  }

while ( <> ) {
    s/getElement\(objectMap\.getIdentifier\(("?[a-z.]+"?)\)/fix($1)/e ;
    s/objectMap\.getIdentifier\(("?[a-z.]+"?)\)/fix($1)/e ;
    print
}

【问题讨论】:

    标签: perl substitution


    【解决方案1】:

    这似乎提供了您要求的输出。我不明白您要更改的语言,因此可能存在处理错误的极端情况。在更改文件之前进行备份!

    #!/usr/bin/perl
    use warnings;
    use strict;
    
    sub fix {
        my ($id) = @_;
        return $id =~ s/[.]/_/gr
    }
    
    while (<>) {
        s{getElement\((object|login)Map\.getIdentifier\("([^"]*)"\)\.replace\("\$Page", "([^"]*)"\)\)}
         {"$1PageFactory." . fix($2) . qq(("$3"))}ge;
    
        s{(object|login)Map\.getIdentifier\("([^"]*)"\)}
         {"$1PageFactory." . fix($2)}ge;
    
        print;
    }
    

    【讨论】:

    • 我应该怎么做才能处理 $Page 的一般情况?我替换为 .replace("\$[^"]*", "([^"]*)"))} 但这会在某些情况下引发错误,例如: Click(getElement(objectMap.getIdentifier("fileName").替换(“$文件名”,文件夹名)),文件夹名); >>>> Click(getElement(objectPageFactory.fileName.replace("$Filename", folderName)), folderName); clickJavaScript(getElement(objectMap.getIdentifier("file.moreOptions.btn").replace("$File", folderName))); >>>。 clickJavaScript(getElement(objectMapPageFactory.file_moreOptions_btn.replace("$File", folderName)));
    • @user8167143:什么错误?第一种情况完全按照您的说明进行替换。第二种情况使用objectPageFactory 而不是objectMapPageFactory,因为这就是示例中显示的 1. 和 3.。选厂有哪些规定?
    • 没关系!一些脚本中有双倍空格,这就是为什么它没有被替换,弄清楚了!感谢您的脚本,效果很好
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多