【问题标题】:How to click on a hidden button with selenium through Python如何通过Python单击带有硒的隐藏按钮
【发布时间】:2019-07-16 03:41:13
【问题描述】:

我正在尝试单击具有以下来源的页面上的 Upload from my Computer 按钮。

我正在使用 selenium 并尝试了几种不同的方法。过去失败的方法与当前失败的方法一起在下面注释掉。当前方法返回的错误如下。

谁能看到问题可能是什么并提出解决方法?我是 selenium 的新手,所以如果有人可以提供一些关于 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: 

【问题讨论】:

  • 我猜那个按钮在IFRAME...你检查了吗?如果您单击它,ID btnUploadFromMyComputer 应该可以工作。那不是你的尝试之一。

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


【解决方案1】:

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

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

【讨论】:

  • @halfer 无论如何,我已经禁止提问 [几乎 1 年]。我已经尝试编辑、改进和删除导致我愚蠢行为的重复问题。但是,我仍然无法提出问题。你有什么建议吗?苦了好久,等版主看看。
  • 是的,plenty of recommendations here。祝你好运! (对于它的价值,我认为问题禁令和答案禁令是分开计算的,所以对答案的投票不一定会阻止你提问)。
【解决方案2】:

要点击文本为 从我的电脑上传的元素,您需要诱导 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
    

【讨论】:

  • 谢谢,您对 css_selector 的建议奏效了。然后它会弹出一个弹出框供我选择要上传的文件。关于如何通过文件路径上传文件的任何建议?另外,为什么将“#btnUploadFromMyComputer”添加到 css_selector?我对硒还是很陌生。
  • @modLmakur 在css_selector 中,classes. 字符表示,id 属性是用 # 字符表示。如果理想情况是弹出框选择要上传的文件,则必须再次诱导WebDriverWaitECelement_to_be_clickable()。随时针对您的新要求提出新问题。
【解决方案3】:

Selenium 的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
  • 按钮#btnUploadFromMyComputer

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 2014-11-04
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多