python selenium点击按钮

时间:2014-01-25 12:36:12

标签: python selenium selenium-webdriver onclick click

我对python selenium很新,我试图点击一个具有以下html结构的按钮:

<div class="b_div">

    <div class="button c_button s_button" onclick="submitForm('mTF')">
        <input class="very_small" type="button"></input>
        <div class="s_image"></div>
        <span>
           Search
        </span>
    </div>

    <div class="button c_button s_button" onclick="submitForm('rMTF')" style="margin-bottom: 30px;">
        <input class="v_small" type="button"></input>
        <span>
              Reset
        </span>
   </div>

</div>

我希望能够点击上方的SearchReset按钮(显然是单独的)。

我尝试过几件事,例如:

driver.find_element_by_css_selector('.button .c_button .s_button').click()

或,

driver.find_element_by_name('s_image').click()

或,

driver.find_element_by_class_name('s_image').click()

但是,我似乎总是以NoSuchElementException结尾,例如:

selenium.common.exceptions.NoSuchElementException: Message: u'Unable to locate element: {"method":"name","selector":"s_image"}' ;

我想知道我是否可以某种方式使用HTML的onclick属性来进行selenium点击?

任何可以指向正确方向的想法都会很棒。 感谢。

6 个答案:

答案 0 :(得分:77)

删除css选择器中的类之间的空格:

driver.find_element_by_css_selector('.button .c_button .s_button').click()
#                                           ^         ^

=&GT;

driver.find_element_by_css_selector('.button.c_button.s_button').click()

答案 1 :(得分:21)

试试这个:

下载firefox,添加插件&#34; firebug&#34;和&#34; firepath&#34 ;;安装完成后,转到您的网页,启动firebug并找到元素的xpath,它在页面中是唯一的,这样您就不会犯任何错误。

见图: instruction

browser.find_element_by_xpath(&#39;只需复制并粘贴Xpath&#39;)。click()

答案 2 :(得分:15)

对于python,请使用

from selenium.webdriver import ActionChains

ActionChains(browser).click(element).perform()

答案 3 :(得分:2)

我使用Phantomjs作为浏览器遇到了同样的问题,所以我用以下方式解决了问题:

@if (User.Identity.IsAuthenticated)
{
    <ul class="nav navbar-nav navbar-right">
        <li><a asp-area="" asp-controller="Session" asp-action="EditProfile">Hello @User.Identity.Name!</a></li>
        <li><a asp-area="" asp-controller="Session" asp-action="SignOut">Sign out</a></li>
    </ul>
}

基本上我已经在报价中添加了DIV标签的名称。

答案 4 :(得分:2)

以下调试过程帮助我解决了类似的问题。

with open("output_init.txt", "w") as text_file:
    text_file.write(driver.page_source.encode('ascii','ignore'))


xpath1 = "the xpath of the link you want to click on"
destination_page_link = driver.find_element_by_xpath(xpath1)
destination_page_link.click()


with open("output_dest.txt", "w") as text_file:
    text_file.write(driver.page_source.encode('ascii','ignore'))

然后,您应该有两个文本文件,其中包含您所在的初始页面(&#39; output_init.txt&#39;)以及您点击按钮后转发到的页面(&#39; output_dest.txt&#39; )。如果它们相同,那么是的,你的代码不起作用。如果它们不是,那么您的代码可以正常工作,但是您还有其他问题。 我的问题似乎是,用于转换内容以生成我的钩子的必要的javascript尚未执行。

我看到你的选择:

  1. 让驱动程序执行javascript,然后调用您的查找 元素代码。在此查找更详细的答案 stackoverflow,因为我没有遵循这种方法。
  2. 只需在&quot; output_dest.txt&#39;上找到一个类似的钩子。这将产生相同的结果,这就是我所做的。
  3. 在点击任何内容之前尝试等一下:
  4.   

    xpath2 =&#34;您要点击&#34;

    的xpath      

    WebDriverWait(driver,timeout = 5).until(lambda x:   x.find_element_by_xpath(xpath2))

    xpath方法并不一定更好,我只是喜欢它,你也可以使用你的选择器方法。

答案 5 :(得分:2)

打开网站https://adviserinfo.sec.gov/compilation,然后单击按钮下载文件,如果它是使用python硒制成的,我什至也想关闭弹出窗口

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from selenium.webdriver.chrome.options import Options 

#For Mac - If you use windows change the chromedriver location
chrome_path = '/usr/local/bin/chromedriver'
driver = webdriver.Chrome(chrome_path)

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--disable-popup-blocking")

driver.maximize_window()
driver.get("https://adviserinfo.sec.gov/compilation")

# driver.get("https://adviserinfo.sec.gov/")
# tabName = driver.find_element_by_link_text("Investment Adviser Data")
# tabName.click()

time.sleep(3)

# report1 = driver.find_element_by_xpath("//div[@class='compilation-container ng-scope layout-column flex']//div[1]//div[1]//div[1]//div[2]//button[1]")

report1 = driver.find_element_by_xpath("//button[@analytics-label='IAPD - SEC Investment Adviser Report (GZIP)']")

# print(report1)
report1.click()

time.sleep(5)

driver.close()