Как l oop просмотреть все элементы на странице и удалить все из них в селеновом веб-драйвере C#? - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь перебрать oop через 44 022 элемента на странице и пытаюсь удалить их все с помощью Selenium Webdriver C#. Вот мой код:

IReadOnlyList<IWebElement> attachments = driver.FindElements(By.ClassName("attachment"));

foreach (IWebElement attachment in attachments)
{
    attachment.Click();
    driver.FindElement(By.ClassName("delete-attachment")).Click();
    IAlert alert = driver.SwitchTo().Alert();
    alert.Accept();
}

Но он запускается и удаляет около 100, а затем останавливается, но никогда не удаляет их все. Кто-нибудь знает, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Похоже, что FindElements имеет ограничение или элементы в данный момент не отображаются и поэтому не могут быть найдены .

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

public List<IWebElement> attachments;
public void RecursiveDeletion()
{
    this.attachments = driver.FindElements(By.ClassName("attachment"));
    if (this.attachments.Count == 0) return;
    foreach (IWebElement attachment in this.attachments)
    {
        attachment.Click();
        driver.FindElement(By.ClassName("delete-attachment")).Click();
        IAlert alert = driver.SwitchTo().Alert();
        alert.Accept();
    }
    RecursiveDeletion();
}
0 голосов
/ 31 января 2020

Я предполагаю, что страница загружается медленно, и все 44 КБ не отображаются, пока вы не прокрутите или не удалите элементы. Поскольку ваша первоначальная выборка элементов происходит только один раз (она находится за пределами l oop), вы никогда не получите обновления, поскольку элементы будут удалены. Если вы просто переместите извлечение своих предметов внутрь l oop, это должно решить проблему.

foreach (IWebElement attachment in driver.FindElements(By.ClassName("attachment")))
{
    attachment.Click();
    driver.FindElement(By.ClassName("delete-attachment")).Click();
    driver.SwitchTo().Alert().Accept();
}

Примечание. Я также переместил ваш код подтверждения оповещения в одну строку. Это не нужно, просто делает код немного более компактным.

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