【问题标题】:Can I make selenium pause for input and resume on a trigger?我可以让硒暂停输入并在触发器上恢复吗?
【发布时间】:2018-11-23 12:07:57
【问题描述】:

我想知道硒是否可以在下面做?我想自动化自动化流程的某些部分:

  1. 加载网页(使用 Angular 构建),提交表单 预定义的输入
  2. 在下一页,自动填写一些 像之前一样的数据,但是等我填写一些关于特定的输入 输入字段(无法硬编码此数据)
  3. 在此之后,触发器(如按钮 按或组合键;网页之外)应该继续其余的自动化流程并登陆 在第 3 页和第 4 页等等。

我熟悉的唯一选项是在浏览器>检查>控制台中编写和运行修改表单元素的自定义 JS。对于上述内容,我必须在每个页面上运行不同的功能。为此,我可以注释掉除所需函数调用之外的所有内容并运行它。我想我不能从控制台中只选择和运行一部分代码(例如第 1 页)。

PS:如果有任何严格的 SO 人员认为这不适合 SO,还有什么地方可以要求为这类东西找到合适的工具(以自动化为重点?)?

【问题讨论】:

  • 验证码是否有效,测试的意义何在?那是一个外部测试的外部库......你是为了测试你自己的东西。您应该模拟 imo 验证码并完全自动化您的测试
  • @protozoid 这是为了自动化,而不是测试。
  • 那么另一个浏览器是否适合您的网页,其中包含Action 1Action 2 等按钮?
  • 你用硒做什么?? Python java等??
  • @SahilAgarwal Python tarun 它也可以工作

标签: javascript angularjs selenium ui-automation


【解决方案1】:

在 selenium 中有几种等待。

隐式等待:在隐式等待期间,如果 Web 驱动程序由于其可用性而无法立即找到它,它将继续轮询(大约 250 毫秒)DOM 以获取元素。如果元素在指定时间内不可用,则会引发 NoSuchElementException。默认设置为零。一旦我们设置了时间,Web Driver 就会等待 WebDriver 对象实例的周期。

显式等待:可能存在特定元素占用的实例 加载超过一分钟。在那种情况下,你绝对不喜欢 设置一个很长的时间来隐式等待,就好像你这样做你的浏览器会 将为每个元素等待相同的时间。

为避免这种情况,您只需在 仅需要的元素。通过遵循此您的浏览器隐式等待 每个元素的时间都很短,对于 特定元素。

Fluent Wait:假设您有一个元素有时会出现在 只需 1 秒,需要几分钟才能出现。在这种情况下 最好使用流利的等待,因为这将尝试查找元素 一遍又一遍,直到找到它或直到最后的计时器用完。

https://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

http://toolsqa.com/selenium-webdriver/implicit-explicit-n-fluent-wait/

【讨论】:

    【解决方案2】:

    注意:我通过 python 使用过 selenium,所以解决方案反映了这一点。

    哦,是的。这只是一个python脚本。如果 selenium 脚本,请不要考虑它。可以很容易地制作一个 python 脚本来等待输入。

    print("Hi!. Script Started")
    # code to load webpage, automatically fill whatever can be entered
    x = input("Waiting for manual date to be entered. Enter YES when done.")
    # Enter the data on page manually. Then come back to terminal and type YES and then press enter.
    if x == 'YES':
        continue_script_here()
    else:
        kill_script_or_something_else()
    

    【讨论】:

    • 请记住,您的 selenium 会话可能会在您的手动步骤中超时。如果您想这样做,请确保设置较长的会话超时。
    • 我觉得这个答案比我的好
    【解决方案3】:

    选项 1:

    这可以使用显式等待轻松实现。假设您想在某个字段中手动输入数据。您可以让 selenium 等到该字段包含值的点(其“值”属性不为空)。例如:

    WebDriverWait wait = new WebDriverWait(driver, 100);
    //whatever time you think is sufficient for manually entering the data.
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id(>someid>)));
    if(ExpectedConditions.attributeToBeNotEmpty(element,"value"))
    {
      //continue with the automation flow
    }
    

    选项 2:

    这有点骇人听闻。您可以做的是,在执行开始时打开另一个选项卡,然后切换回原来的选项卡,如下所示:

    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
    driver.switchTo().defaultContent();
    

    现在将开始执行,并在您希望脚本停止以手动输入数据的位置,像这样在无限循环中从 selenium 中检索所有选项卡-

    for(int i =1;i>0;i++)
    {
     ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
     if(tabs.size()==2)
     {
      //keep checking for the point when the number of tabs becomes 1 again.
      continue;
     }
     else
     {
      break;
     }
    }
    //your rest of the automation code
    

    这个想法是让 selenium 暂停执行(因为它会卡在循环中)直到选项卡数再次变为 1。在此期间,您输入数据并关闭空选项卡,以便 selenium 可以继续执行。

    你也可以试试this

    【讨论】:

    • attributeToBeNotEmpty 不再存在(或者对于 Python 版本从未存在?)。我应该改用element_attribute_to_include 吗?
    • @oldboy 答案不是用python写的。是的,您可以使用 python 的 element_attribute_to_include 作为我们最接近的选项
    • 我知道它不是用 python 编写的,但假设相同的方法可以跨语言使用
    猜你喜欢
    • 1970-01-01
    • 2020-09-05
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 2012-07-01
    相关资源
    最近更新 更多