如何在没有By定位器的情况下使用WebDriverWait.until?

问题描述:

我使用的Selenium WebDriver与一个框架(黄瓜)实现,我面临一个问题,等待一个元素被加载之前执行一个动作。如何在没有By定位器的情况下使用WebDriverWait.until?

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

然后,我想使用显式等待来尽可能缩短每个案例的等待时间。 问题是WebDriverWait.until中的ExpectedConditions上的大多数元素都在寻找位于By定位器(它们是ClassName,CssSelector,Id,LinkText,Name,PartialLinkText,Tagname或XPath)的元素。 我在用于点击webelement的常规函数​​中使用WebDriverWait.until。 我测试的网站上的webelements是由dojo生成的,没有静态ID。它们并不总是具有其他类型的定位器,或者它们不是静态的。 开发人员然后向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作为FluentWebElement第一webelement的功能。

问题是如果webelement没有立即加载,findDataAutomationId会失败,这会使WebDriverWait.until无意义。您是否看到另一种方法来解决By Locators在不重构网站的情况下?

+0

请发表您的findDataAutomationId片断 –

+0

这就是: 公共FluentWebElement findDataAutomationId(字符串dataautomationid){ 回报的FindFirst(getDataAutomationId(dataautomationid)); (DataAutomationID = {0}]“,dataautomationid);返回format(”[data-automation-id = {0}]“。 } –

而不是使用方法findDataAutomationId检索webelement,你可以直接找到webeelement,然后点击它,如下图所示:

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(); 
} 

,或者,如果数据自动化-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(); 
} 
+0

明智的是,解决方案与在Xpath中用“*”替换findDataAutomationId()。getAttribute()一样简单。非常感谢你。 事实上,使用webelement而不是使用findDataAutomationId()再次检索它更清洁。 –

+0

很高兴为你工作..干杯.. :) – Subh

使用“presenceOfElementLocated”方法而不是“elementToBeClickable”。这种变化可能会帮助你

+0

presenceOfElementLocated也使用定位器,所以它的工作允许我寻找具有data-automation-id属性的webelements。 问题不在于条件的类型,而在于我可以使用的定位器的类型。 –

你下面的解决方案。它不会返回,直到申请()为真或直到等待超时

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; 
       } 
      }); 
    }