Доступ к выпадающему элементу с помощью Python Selenium - PullRequest
0 голосов
/ 15 января 2019

Поэтому я пытаюсь выяснить, как получить cssSelector для доступа к элементу HTML из веб-драйвера Python для селена.

У меня есть страница, где есть два варианта выпадающего меню. Я хочу выбрать тот, который показывает «Быстрый режим», а затем выбрать второй вариант в этом раскрывающемся списке с помощью веб-драйвера Python.

enter image description here

Аналогичное раскрывающееся меню слева также имеет похожий элемент

<a class="btn-pill dropdown-toggle active" href="#" data-dialog-id="dialog-view28363">                      <i class="message-indicator icon-info-circle" style=""></i>                     Job<span class="caret"></span>                  </a>

Как мне найти правильный cssSelector , поскольку имена классов выглядят одинаково.

Существует data-dialog-id, который, кажется, имеет значения diff, но я не уверен, какой метод в веб-драйвере может помочь мне использовать это.

Мой код для доступа к элементам выглядит следующим образом:

driver = webdriver.Chrome()
toggle_button=driver.find_element_by_css_selector('a[data-dialog-id="]')
toggle_button.click()

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Я сделал один проект автоматизации в Java Selen, где я выполняю действия в раскрывающихся списках

// в объектах страницы

public static WebElement idProof(WebDriver driver)
    {
        WebElement element=null;
        WebDriverWait wait=new WebDriverWait(driver, 50);
        element=wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='panel-body']//div[3]//div[2]//div[1]//a[1]//span[1]")));
        return element;
    }

    public static WebElement idProofVoterId(WebDriver driver, String idVal)
    {
        WebElement element=null;
        WebDriverWait wait=new WebDriverWait(driver, 50);
        element=wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//li[contains(text(),'" + idVal +"')]")));
        return element;
    }

// В тестовом файле

    {        WebElement idProof = FrmrPage.idProof(driver);
            idProof.click();
            Genlib.sleep(2000);

            WebElement voterId = FrmrPage.idProofVoterId(driver, datArr[8]);
            voterId.click();
            test.pass("ID Proof: " + datArr[8]);
            Genlib.sleep(1000);
    }
0 голосов
/ 15 января 2019

К click() для элемента с текстом Задание вы должны заставить WebDriverWait для элемента быть активным , и вы можете использовать любой из следующий Locator Strategies :

  • Использование PARTIAL_LINK_TEXT:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, "Job"))).click()
    
  • Использование XPATH A:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='btn-pill dropdown-toggle active' and contains(., 'Job')]"))).click()
    
  • Использование XPATH B:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='btn-pill dropdown-toggle active' and normalize-space()='Job']"))).click()
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
0 голосов
/ 15 января 2019

ваш снимок экрана не отображает какие-либо параметры, которые появятся после выбора «Быстрого режима», поэтому вам сложно будет помочь с выбором этого. Тем не менее, «Быстрый режим» имеет уникальный класс, «dropdown-toggle-search-mode»

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
fast_mode_button=driver.find_element_by_css_selector('a.dropdown-toggle-search-mode')
fast_mode_button.click()
# now wait for the menu to open, before clicking on your option
options = WebDriverWait(driver, 10).until(EC.visibility_of_elements_located((By.CSS_SELECTOR, 'css_selector_for_menu_options')))
options[2].click()

Я избегаю этого атрибута data-dialog-id только потому, что подозреваю, что он не будет соответствовать каждой сборке продукта, но если вы точно знаете, что всегда будет связь один к одному, вы может использовать его, но ТОЛЬКО после того, как вы нажмете на ссылку, которая вызывает его (тот fast_mode_button).

...