Как нажать на тег привязки с помощью селена webDriver - PullRequest
0 голосов
/ 17 января 2020

Я не могу нажать на кнопку с некоторыми проблемами видимости. Мне нужно сначала навести курсор на эту ссылку, чтобы получить ссылку, а затем нажать на нее.

<a tabindex="0" 
   class="cardPreviewLink expand-icon" 
   aria-label="card opens in new tab" 
   target="_blank" 
   id="card-preview-link-19479" 
   href="/card/19479?$filters@$pattern=10532372&amp;type===&amp;dimension=chargeback_id"> 
  <button class="MuiButtonBase-root MuiIconButton-root" tabindex="-1" type="button">
    <span class="MuiIconButton-label">
      <svg class="MuiSvgIcon-root open-icon" 
           focusable="false" 
           viewBox="0 0 24 24" 
           aria-hidden="true" 
           role="presentation">
        <path d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z"/>
      </svg>
    </span>
  </button>
</a>

Кодовые испытания:

WebDriverWait wait4 = new WebDriverWait(driver, 60);
wait4.until(ExpectedConditions.visibilityOfElementLocated(By.className("cardPreviewLink expand-icon")));
driver.findElement(By.className("cardPreviewLink expand-icon")).click();

Ошибка:

Timeout Exception because of No such Element Exception

Ответы [ 3 ]

1 голос
/ 17 января 2020

Требуемый элемент является динамическим c элементом, поэтому для click() на элементе вы должны вызвать WebDriverWait для elementToBeClickable(), и вы можете использовать любую из следующих стратегий локатора :

  • cssSelector:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("a.cardPreviewLink.expand-icon > button.MuiButtonBase-root.MuiIconButton-root > span.MuiIconButton-label"))).click();
    
  • xpath:

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='cardPreviewLink expand-icon']/button[@class='MuiButtonBase-root MuiIconButton-root']/span[@class='MuiIconButton-label']"))).click();
    
0 голосов
/ 18 января 2020

Вы можете попробовать щелкнуть webdriver wait для element to receive click.

By buttonBy = By.cssSelector("a.cardPreviewLink.expand-icon > button"));

WebDriverWait wait = new WebDriverWait(driver, 50);
wait.until(ExpectedConditions.elementToBeClickable(buttonBy);

Если вышеуказанный подход не сработает, вы можете попробовать click using JS. Здесь я просто жду visibility of element, так как если элемент может получить щелчок, тогда первый подход должен работать.

wait.until(ExpectedConditions.visibilityOfElementLocated(buttonBy);

WebElement button=driver.findElement(buttonBy);

JavascriptExecutor executor = (JavascriptExecutor)driver;

executor.executeScript("arguments[0].click();", button);
0 голосов
/ 18 января 2020

By.className () не будет работать с именами, имеющими пробелы - cardPreviewLink expand-icon . Вместо этого попробуйте использовать cssSelector или xpath.

Xpath Пример:

WebDriverWait wait4 = new WebDriverWait(driver, 60);
WebElement element = wait4.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//a[contains(@class,'cardPreviewLink'][contains(@class,'expand-icon']")));
element.click();

'visibilityOfElementLocated' должно работать. Если этого не произошло, как упомянул Debanjan, попробуйте использовать elementToBeClickable. Кроме того, wait.until сам вернет объект WebElement. Вы можете использовать то же самое, чтобы нажать на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...