Pyton with Selenium: нажмите здесь и найдите различные классы пролета - PullRequest
1 голос
/ 09 июля 2019

Я пытаюсь написать программу, которая работает так:

  1. Перейти на главную страницу
  2. Щелкните по первому элементу в списке (все элементы начинаются с «item-»), и я попаду на следующую страницу.
  3. Найдите кнопку с надписью "A" и нажмите ее.
  4. Найдите кнопку «Подтвердить» и нажмите ее.
  5. Вернитесь назад и к тому же для пункта 2, пункта 3 и т. Д.

У меня две проблемы. Во-первых, кнопка с буквой «А» иногда имеет больше текста, чем просто буква «А», например. "A" со сноской "123". Я не знаю много о HTML, но это приводит к различным классам span и div:

<div class="selectOne">
    <span class="selectObject-no-footnote">A</span>
</div>

<div class="selectOne-with-footnote">
    <span class="selectObject">A</span>
        <span class="selectFootnote">
            <span>123</span>
        </span>
</div>

Они никогда не находятся на одной странице, но с моим решением кнопка "A" не всегда нажимается. Трудно сказать, если это потому, что мое решение не является правильным или оно приходит от второй проблемы. Часто (это случайно), когда я захожу на страницу с кнопками, какой-то баннер скатывается с верха страницы, и весь сайт смещается так, что моя кнопка «Подтвердить» не видна. Я решил, что просто прокручиваю сайт вниз каждый раз и только потом начинаю искать кнопки. Тогда не имеет значения, скатывается баннер или нет, потому что в обоих случаях видны кнопки «А» и «Подтверждение». Но все же у меня нет 100% точности, и иногда я получаю исключение click intercepted. Мой код:

i=0
a=1
while True:
    WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//*[starts-with(@id, 'item-')]")))
    items = driver.find_elements_by_xpath("//*[starts-with(@id, 'item-')]")
    try:
        items[i].click()

        try:
            try:
                driver.execute_script("window.scrollTo(0, 250)")
                WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH,"//span[@class='selectObject-no-footnote'][contains(text(),'A')]")))
                driver.find_element_by_xpath("//span[@class='selectObject-no-footnote'][contains(text(),'A')]").click()
            except Exception as e:
                a = 0
                print(e)


            if a==0:
                driver.execute_script("window.scrollTo(0, 250)")
                WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='selectObject'][contains(text(),'A')]")))
                driver.find_element_by_xpath("//span[@class='selectObject'][contains(text(),'A')]").click()
                a=1

            WebDriverWait(driver,1).until(EC.element_to_be_clickable((By.ID, 'confirm')))

            driver.find_element_by_id('confirm').click()
        except Exception as e:
            print(e)

        i += 1

        driver.back()

    except IndexError:
        print(items)
        print(i)

        break

Есть ли другой инструмент, который мог бы делать это, не беспокоясь о том, что элементы покрыты чем-то или находятся вне окна? (Scrappy?)

1 Ответ

0 голосов
/ 09 июля 2019

Общая логика верна.Я бы предложил внести два изменения: (Это в JAVA)

1) Найдите кнопку с текстом A, используя следующий xpath.Это должно работать для обоих случаев (A или A123)

WebElement button = driver.findElement(By.xpath("//span[contains(@class,'selectObject')][contains(text(),'A')]");
button.click();

2) Вы можете прокрутить элемент вниз и подождать, пока вышеуказанный элемент станет видимым и активным на странице.

((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", button);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...