错误,因为元素在selenium中无法点击

时间:2017-06-20 07:03:16

标签: java selenium automation

Dom结构:

 <li class="slds-dropdown-trigger slds-dropdown-trigger--click slds-m-left--
  x-small" data-aura-rendered-by="534:20;a">
 <!--render facet: 537:20;a-->
 <!--
 render facet: 541:20;a--><button class="bare slds-button uiButton 
 forceHeaderButton oneUserProfileCardTrigger" aria-live="off" type="button" 
 data-aura-rendered-by="184:190;a" data-aura-class="uiButton 
 forceHeaderButton 
 oneUserProfileCardTrigger"><!--render facet: 185:190;a--><!--render facet: 
 187:190;a-->
 <div class="tooltipTrigger tooltip-trigger uiTooltip" aria-describedby="tt-
 for-174:190;a" tabindex="-1" data-aura-rendered-by="179:190;a" data-aura-
 class="uiTooltip">
 <span data-aura-rendered-by="171:190;a" class="uiImage" 
 data-aura-class="uiImage"><img data-aura-rendered-by="169:190;a" 
 src="https://c.ap5.content.force.com/profilephoto/005/T/1" 
 class="profileTrigger" alt="">
 </span><span class="tooltip-invisible" 
 role="tooltip" id="tt-for-174:190;a" data-aura-rendered-by="181:190;a">View 
 profile</span>
 </div></button><!--render facet: 543:20;a-->
 </li>

我尝试了Logout的这些代码行:

首先点击退出符号:

   WebDriverWait wait3 = new WebDriverWait(driver, 20); 
   driver.findElement(By.xpath("//img[@class = 'profileTrigger']")).click();
   JavascriptExecutor jse = (JavascriptExecutor)driver;
   /*exe1.executeScript("arguments[0].click();", newbt);*/
   jse.executeScript("scroll(250, 0)");

再次点击退出按钮:

 driver.findElement(By.xpath("//a[@class = 
       'profile-link-label logout uiOutputURL']"));

我收到错误,因为Element无法点击。

2 个答案:

答案 0 :(得分:0)

1.使用scrollTo元素选择 - 这将确保元素可见:

WebElement element = driver.findElement(By.xpath("//button[@class='oneUserProfileCardTrigger']"));
((JavascriptExecutor) driver)
    .executeScript("arguments[0].scrollIntoView(true);", element);

2.始终使用延迟或在点击前滚动后等待。浏览器需要时间。

3.如果没有任何帮助 - 请使用javascript点击。糟糕的解决方案,因为它不像真正的用户那样,但总会有效:

WebElement element = driver.findElement(By.xpath("//button[@class='oneUserProfileCardTrigger']"));
((JavascriptExecutor)driver)
    .executeScript("arguments[0].click();", element);

答案 1 :(得分:0)

@SrieedherSanthakumar 我很少想首先澄清一下,不管你是否依赖等待。就像你点击某些东西并想要等待某些东西然后再次点击一样处理?

如果是这样,您可能需要修改下面的第一个电话:

 WebDriverWait wait3 = new WebDriverWait(driver, 20); 
       driver.findElement(By.xpath("//img[@class = 'profileTrigger']")).click();
    WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
       JavascriptExecutor jse = (JavascriptExecutor)driver;
       /*exe1.executeScript("arguments[0].click();", newbt);*/
       jse.executeScript("scroll(250, 0)");

一旦您等待加载页面或预期ID可见,然后继续第二次通话。在您第二次通话之前,我点击 profileTrigger 后,我无法确定您是否在第一次加载来电中等待您的对象。