Как идентифицировать элемент с атрибутом href с помощью Selenium и C# - PullRequest
1 голос
/ 27 мая 2020

У меня проблема с выбором на href

<a id="1 - GovSearch" name="1 - GovSearch" title="Population and Immigration Authority" 
href="https://www.gov.il/en/Departments/population_and_immigration_authority" class="content-title 
first-result" ng-class="{ 'first-result': $first }">
 <!-- ngIf: item.Extension -->
 <span ng-class="item.SubTitle ? 'pipe-after':''" class="ng- 
     binding"> Population and Immigration Authority </span>
                                        <!-- ngIf: item.SubTitle -->
                                    </a>

Я пытался сделать с linktext и получил ошибку:

element.FindElement(By.LinkText("Population and Immigration Authority")).Click();

Получение этой ошибки:

OpenQA.Selenium.StaleElementReferenceException: 'stale element reference: element is not attached to the page document (Session info: chrome=83.0.4103.61)'

Ответы [ 2 ]

3 голосов
/ 27 мая 2020

Немного неубедительно из деталей, почему вы должны увидеть StaleElementReferenceException . Однако этот элемент является элементом Angular внутри дочернего тега <span> элемента <a>. Таким образом, вы должны вызвать WebDriverWait для желаемого ElementToBeClickable(), и вы можете использовать любую из следующих стратегий локатора в качестве решений:

  • CssSelector:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("a[id$='GovSearch'][name$='GovSearch'][title='Population and Immigration Authority'] span.ng-binding"))).Click();
    
  • XPath:

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//a[@title='Population and Immigration Authority']//span[@class='ng-binding' and contains(., 'Population and Immigration Authority')]"))).Click();
    
0 голосов
/ 27 мая 2020

Эта ошибка обычно возникает, когда элемент был изменен или удален из-за того, что пользователь пытался сделать. Вы можете попробовать перехватить исключение, а затем снова щелкнуть

try {
    element.FindElement(By.LinkText("Population and Immigration Authority")).Click();
}
catch(org.openqa.selenium.StaleElementReferenceException ex)
{
   element.FindElement(By.LinkText("Population and Immigration Authority")).Click();
}

Webdriver внутренне использует метод getElementAt и уникальный идентификатор UUID для поиска элементов. Каждый раз, когда этот UUID изменяется для элемента по какой-либо причине, и вызов, который делает пользователь, ссылается на старый UUID, метод getElementAt вызывает исключение. Вы также можете увидеть исключение, относящееся к методу fxdriver.cache.getElementAt. Официальное объяснение этой ошибки можно найти здесь

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