当前位置: 首页 > 知识库问答 >
问题:

如何使用WebDriverWait。直到没有定位器?

谢学名
2023-03-14

我使用的是用框架(Cucumber)实现的SeleniumWebDriver,在对其执行操作之前,我面临一个等待加载元素的问题。

最初,我想使用隐式等待,但是如果元素没有立即加载,它将等待超时。通常情况下,它使我的测试比我想的要长。

然后,我想使用显式等待,使每种情况下的等待时间尽可能短。问题是,大多数人在WebDriverWait中都是基于预期条件的。直到您查找由定位符定位的元素(如ClassName、CssSelector、Id、LinkText、Name、PartialLinkText、Tagname或XPath)。我正在使用WebDriverWait。直到在一般功能中用于单击webelement。我正在测试的网站上的Webelements是由dojo生成的,没有静态id。它们不总是有其他类型的by定位器,或者它们不是静态的。然后,开发人员向webelement添加了一个名为data automation id的附加属性。我想在显式等待中使用此属性,但找不到方法。

我尝试使用xpath使用以下代码:

public void clickOnDataAutomationId(String dataautomationid) {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//" + findDataAutomationId(dataautomationid).getAttribute("tagName") + "[contains(@data-automation-id, '" + dataautomationid + "')]")));
    findDataAutomationId(dataautomationid).click();
}

findDataAutomationId()是一个函数,它将包含数据自动化id的第一个webelement作为FluentWebElement返回。

问题是,如果webelement没有立即加载,findDataAutomationId将失败,这使得WebDriverWait.until毫无意义。您是否看到了无需重构网站即可绕过By Locator的另一种方法?

共有3个答案

呼延弘方
2023-03-14

您需要以下解决方案。在apply()为true或等待超时之前,它不会返回

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(new Function<WebDriver, Object>() {
                @Nullable
                public Object apply(@Nullable WebDriver input) {
//add any condition or check your data-automation-id is visible/clickable
                    return true; 
                }
            });
    }
金坚
2023-03-14

使用“presenceOfElementLocated”方法而不是“ElementToBickable”。这个改变可能会帮助你

姬选
2023-03-14

您不必使用findDataAutomationId方法检索webelement,而可以直接查找webelement,然后单击它,如下所示:

public void clickOnDataAutomationId(String dataautomationid) {
   WebDriverWait wait = new WebDriverWait(driver, 10);
   WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(@data-automation-id, '" + dataautomationid + "')]")));
   element.click();
} 

或者,如果data-自动化id是一个完整的文本,而不是一个部分,那么你可以使用下面的代码:

public void clickOnDataAutomationId(String dataautomationid) {
   WebDriverWait wait = new WebDriverWait(driver, 10);
   WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@data-automation-id, '" + dataautomationid + "')]")));
   element.click();
}
 类似资料:
  • 我遇到了以下问题:当手机应该输入时,我需要实现这种情况的解决方案。这部手机应该有不可移动的部分,最后四个数字应该在开头填写下划线,然后当用户键入下划线时,应该将其更改为数字,例如: < code> 12345____ - 我实现了不可移除的部分。我是这样做的: 但现在我不明白,如何处理下划线的逻辑。我尝试在< code>doAfterTextChanged中添加下划线,比如if

  • 问题内容: 我已经在我们的开发RedHat linux机器上获得了sudo访问权限,而且我似乎经常发现自己需要将输出重定向到我通常没有写访问权限的位置。 麻烦的是,这个人为的例子不起作用: 我刚收到回复: 我该如何工作? 问题答案: 您的命令无效,因为重定向是由您的外壳执行的,该外壳没有写权限。sudo 不 执行输出的重定向。 有多种解决方案: 使用sudo运行shell并使用以下选项向其提供命令

  • 我目前正在尝试从头开始做一个学习型Ai来熟悉它是如何工作的(项目代码链接在这里,我当前的问题是找到一种方法,一旦eof已经达到,就停止第20行的while循环。我尝试过使用fin.eof,当我使用它时得到的输出是“分段错误(核心转储)”。我如何让代码正常运行? 下面是我的代码:

  • 问题内容: 我正在尝试使curl遵循重定向,但无法完全正常工作。我有一个字符串,我想将它作为GET参数发送到服务器并获取结果URL。 例: 字符串= Kobold害虫 网址= _www.wowhead.com/search?q=Kobold+Worker_ 如果您转到该URL,它将把您重定向到“ www.wowhead.com/npc=257”。我希望curl将此URL返回到我的PHP代码,以便我

  • 问题内容: 我想使用兼容W3C的CSS定位IE7和IE8。有时为一个版本修复CSS不能为另一版本修复。我该如何实现? 问题答案: 明确目标IE版本,无需使用HTML和CSS进行破解 如果您不希望CSS受到黑客攻击,请使用此方法。在元素中添加一个浏览器唯一的类,以便以后可以基于浏览器进行选择。 例 然后,在CSS中,您可以非常严格地访问目标浏览器。 例 带有CSS“ Hacks”的目标IE版本 更重

  • 问题内容: 4年前关闭。 我想定位Edge并使flexbox的行为类似于Firefox 33 / Chrome。 可以在CSS中定位Edge吗? 问题答案: 为了定位Edge,我们可以检查是否支持,Edge是唯一支持此属性的Microsoft浏览器: 或这种一线式(一种适用于Edge,也适用于所有IE):