如何通过Python单击带有硒的隐藏按钮

时间:2019-02-22 05:08:04

标签: python-3.x selenium selenium-webdriver xpath css-selectors

我正在尝试在具有以下来源的页面上单击一个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 :(得分:1)

硒的click()不支持对不可见元素进行操作。因此,当您的代码打算单击该按钮时,请再次确认该按钮是否可见。

如果该按钮不可见,您如何动手单击它?因此,将脚本更改为按照人工步骤操作,以使按钮可见,然后再单击它。

回到下面的代码失败

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

原因是您给了错误的CSS选择器,该选择器无法从页面util中找到任何元素达到等待超时。

该按钮的正确css选择器可以是以下任意一项:

  • button.center-block.btn.btn-white-fill.btn-block
  • button#btnUploadFromMyComputer

答案 1 :(得分:1)

要单击文本为从我的计算机上载的元素,您需要诱使 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
    

答案 2 :(得分:0)

对于C#,我使用 IJavaScriptExecutor 单击元素。您可以在此解决方案中搜索Python语法

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