【问题标题】:Protractor - ScrollDown in a Dialog Container to Click in a element量角器 - 在对话框容器中向下滚动以单击元素
【发布时间】:2020-07-27 16:04:56
【问题描述】:

我正在尝试使用 Dialog Container (Image of Dialog Container) 中的量角器与一些隐藏元素进行交互,所以我尝试了很多选项,但我没有成功。 (在 chrome 中测试)

我的设置: I/status - selenium 独立版本可用:3.141.59 [last]

I/status - 可用的 chromedriver 版本:2.46、77.0.3865.10、80.0.3987.16 [last]

I/status - geckodriver 可用版本:v0.26.0 [last]

I/status - IEDriverServer 不存在

I/status - android-sdk 不存在

I/status - appium 不存在

第一次尝试使用浏览器操作来翻页对话框并找到隐藏的元素:

    placeSistema = element(by.css('element(by.css('[placeholder = "Sistema"]'))

    this.clicaCampoSistema = async function () {
        await browser.actions().sendKeys(protractor.Key.PAGE_DOWN).perform();
        await placeSistem.click();
    }

失败: sendKeysToActiveElement

第二次尝试使用 mouseMove 点击隐藏元素:

        placeSistema = element(by.css('element(by.css('[placeholder = "Sistema"]'))

        this.clicaCampoSistema = async function () {
        await browser.actions().mouseMove(placeSistema).click().perform();

    }

错误:超时 - 在 jasmine.DEFAULT_TIMEOUT_INTERVAL 指定的超时时间内未调用异步回调。

有人有建议吗?非常感谢!!!

  • 解决方案:在社区的帮助下,我使用这段代码解决了我的问题

await browser.executeScript("arguments[0].click()", placeSistema);

效果很好!

【问题讨论】:

  • 您的对话框不是本机浏览器对话框,而是自定义的 DIV 对话框。您不能依赖 click() 或 'mouseMove()' 使其可见。你需要使用executeScript()来运行一个javascript sn-p,如果我能从我以前的项目中找到它,我会发布它。
  • 谢谢@yong 我要等待解决方案。
  • @Nascimento,您是否尝试过 DublinDev 回答以使用 scrollIntoView()。他的回答就是我想说的。
  • 我试过@yong。没有成功!
  • 我找到了解决方案!等待browser.executeScript("arguments[0].click()", placeSistema); 效果很好,非常感谢您的帮助! @yong

标签: javascript selenium jasmine protractor selenium-chromedriver


【解决方案1】:

您是否尝试过将 scrollIntoView 与 executeScript 一起使用?这应该将该元素滚动到视口中

placeSistema = element(by.css('element(by.css('[placeholder = "Sistema"]'))

this.clicaCampoSistema = async function () {
    await browser.executeScript('arguments[0].scrollIntoView(true)', placeSistema.getWebElement());
    await placeSistem.click();
}

【讨论】:

  • 感谢您的回答@DublinDev,但它没有用。我收到消息“失败:元素不可交互”
  • 我找到了解决方案!等待browser.executeScript("arguments[0].click()", placeSistema); 效果很好,非常感谢您的帮助! @都柏林开发
【解决方案2】:

默认情况下,量角器会将元素滚动到可见性。使用 element.click() 将:

  1. 定位元素
  2. 滚动到它并将光标移动到元素的中心
  3. 执行点击

只要元素在 DOM 中,protractor 就可以定位到它们,只要有滚动条,protractor 就会知道如何使用它。

如果通常的 element.click() 不起作用,您可以尝试使用 browser.actions()

await browser.actions().mouseMove(elem).perform();
await browser.sleep(1000); // Shouldn't be necessary, but it might help
await browser.actions().click().perform();

或者只是

await browser.actions().mouseMove(elem).click().perform();

我之前遇到过将 2 个命令放在一起的问题,这是由动画引起的,所以我更喜欢将其拆分为 2 个不同的命令。

如果这些都不起作用,您可以尝试在功能中禁用 w3c,因为 Selenium-webdriver 4.0 和 Protractor 6.0.0 不支持量角器使用的当前 Actions Api,并且在当前的 chromedriver 版本中仍然存在一些错误.

【讨论】:

  • 嗨@L。 Aleksiev,我尝试了 option1 和 option2,但我有同样的错误。量角器不会向下滚动来找到营地。我不知道该怎么做:“在功能中禁用 w3c”,您有任何解释链接吗?
  • 我正在考虑使用 sendKeys TAB 来查找我需要的元素...但是我尝试了很多方法来使用 Keys,但我没有成功。
  • @DanielNascimento 在量角器配置中,在浏览器功能中添加 w3c: false 。 stackoverflow.com/a/57100270/8420947
  • 我找到了解决方案!等待browser.executeScript("arguments[0].click()", placeSistema); 效果很好,非常感谢您的帮助! @L。阿列克谢夫
【解决方案3】:

试试下面的脚本:

   placeSistema = element(by.css('element(by.css('[placeholder = "Sistema"]'))
   browser.executeScript(() => {
   placeSistema .scrollIntoView();
   }, el.getWebElement());
   placeSistema.click()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多