Как нажать на скрытую кнопку с селеном через Python - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь нажать кнопку Upload from my Computer на странице, источник которой приведен ниже.

Я использую селен и пробовал несколько разных подходов.Прошлые неудачные подходы прокомментированы ниже, наряду с текущим неудачным подходом.Ошибка, которая возвращается с текущим подходом ниже.

Может кто-нибудь увидеть, в чем может быть проблема, и предложить, как ее решить?Я новичок в селене, так что если кто-то может дать какое-то объяснение того, что делает html и как их код решает проблему, это было бы очень полезно для моего понимания.

HTML-код кнопки:

<div class="hidden-xs">
    <label for="fuUploadFromMyComputer" class="hidden">
        Upload from my Computer
    </label>
    <input id="fuUploadFromMyComputer" type="file" name="upload">
    <button id="btnUploadFromMyComputer" 
            class="center-block btn btn-white-fill btn-block " 
            data-resume-type="COMPUTER" type="submit">
        <i class="zmdi zmdi-desktop-mac"></i>
        Upload from my Computer
    </button>
</div>

попыток:

# clicking upload button

# upload_btn = driver.find_element_by_id("fuUploadFromMyComputer")
# upload_btn = driver.find_element_by_css_selector(
#                 '.center-block.btn.btn-white-fill.btn-block')
# upload_btn = driver.find_element_by_link_text('Upload from my Computer')

# upload_btn.click()



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

WebDriverWait(driver, 20).until(EC.element_to_be_clickable(
     (By.CSS_SELECTOR, "div.center-block btn.btn-white-fill.btn-block"))).click()

ошибка:

---------------------------------------------------------------------------
TimeoutException                          Traceback (most recent call last)
<ipython-input-43-8fd80ff3c690> in <module>()
     14 from selenium.webdriver.support import expected_conditions as EC
     15 
---> 16 WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.center-block btn.btn-white-fill.btn-block"))).click()
     17 
     18 time.sleep(3)

~/anaconda/envs/py36/lib/python3.6/site-packages/selenium/webdriver/support/wait.py in until(self, method, message)
     78             if time.time() > end_time:
     79                 break
---> 80         raise TimeoutException(message, screen, stacktrace)
     81 
     82     def until_not(self, method, message=''):

TimeoutException: Message: 

Ответы [ 3 ]

0 голосов
/ 22 февраля 2019

Selenium's click() не поддерживает работу с невидимым элементом.Поэтому, пожалуйста, дважды подтвердите, видна ли кнопка или нет, когда ваш код намерен нажать на нее.

Если кнопка не видна, как вы нажимаете на нее?Таким образом, измените ваш сценарий так, чтобы он выполнял простые действия, чтобы сделать кнопку видимой, прежде чем вы сможете нажать ее.

Вернемся к вашей ошибке на приведенном ниже коде

WebDriverWait(driver, 20).until(EC.element_to_be_clickable(
     (By.CSS_SELECTOR, "div.center-block btn.btn-white-fill.btn-block"))).click()

Причина в том, что вы даете неправильный CSSселектор, который не может найти ни одного элемента со страницы, достигает тайм-аута ожидания.

Правильный селектор кнопки css может быть одним из следующих:

  • button.center-block.btn.btn-white-fill.btn-block
  • button # btnUploadFromMyComputer
0 голосов
/ 22 февраля 2019

Чтобы щелкнуть по элементу с текстом Загрузить с моего компьютера , вам нужно активировать WebDriverwait , чтобы элемент был кликабельным , и вы можете использовать любой изследующие решения:

  • CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.center-block.btn.btn-white-fill.btn-block#btnUploadFromMyComputer"))).click()
    
  • XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='center-block btn btn-white-fill btn-block ' and @id='btnUploadFromMyComputer']"))).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 голосов
/ 22 февраля 2019

Для C # я использовал IJavaScriptExecutor , чтобы щелкнуть по элементу.Вы можете найти это решение для синтаксиса Python

public static void scrollElementToClick(IWebDriver driver, IWebElement element)
{
     IJavaScriptExecutor ex = (IJavaScriptExecutor)driver;
     ex.ExecuteScript("arguments[0].click();", element);
}
...