Selenium и Python: проблема с нажатием кнопки с атрибутом data-disable-with - PullRequest
0 голосов
/ 25 декабря 2018

[править: добавлен снимок экрана с представлением разработчика Chrome ниже ...]

Я пытаюсь нажать на этот объект:

<input type="submit" name="commit" value="Load Report" class="button" data-disable-with="Load Report">

В пользовательском интерфейсе кнопка нажимаетсяпока он не нажмет, чтобы начать отчет.Затем он отключается до загрузки отчета.

Но когда я выполняю вызов в коде:

driver.find_element_by_name("commit").click()

, он выдает исключение:

ElementNotVisibleException: element not interactable
  (Session info: chrome=71.0.3578.98)
  (Driver info: chromedriver=2.45.615355 (d5698f682d8b2742017df6c81e0bd8e6a3063189),platform=Mac OS X 10.14.0 x86_64)

Итак, яЯ уверен, что нашел нужную кнопку (если нет другой с именем commit), но по какой-то причине она не активна.Перед ним нет различимых объектов, но может быть что-то скрыто в CSS или ...?Я ничего не знаю, нуб.Есть намеки?

my puzzle

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

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

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.button[name='commit'][value='Load Report']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='button' and @name='commit'][@value='Load Report']"))).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 голосов
/ 25 декабря 2018

Вы можете использовать явное ожидание, чтобы элемент был видимым

 System.setProperty("webdriver.chrome.driver", "path of chromedriver.exe");
 WebDriver driver = new ChromeDriver();
 driver.get("URL");
 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
 driver.manage().window().maximize();
 WebElement commitBtn = driver.findElement(By.name("commit"));
 WebDriverWait wait = new WebDriverWait(driver, 20);
 wait.until(ExpectedConditions.visibilityOf(commitBtn));
 commitBtn.click();

или вы можете использовать javascriptexecurtor

WebElement commitBtn = driver.findElement(By.name("commit"));
WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.visibilityOf(commitBtn));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", commitBtn );
...