python selenium单击按钮


84

我是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属性来使硒单击?

任何能将我指向正确方向的想法都很棒。谢谢。

Answers:



102

在CSS选择器中删除类之间的空间:

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

=>

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

1
我已经尝试了您的建议。我得到同样的NoSuchElementException错误!
AJW 2014年

2
@ AJW,Try print(driver.page_source),然后检查html是否实际包含元素。
falsetru 2014年

谢谢。我做了print(driver.page_source),发现它的名字不同。奇怪。现在,当我拿走空格并重新命名时,它会单击。在后续操作中:如您所见,即使重置按钮和搜索按钮也具有相同的特征class:在这种情况下,如何单击搜索按钮和重置按钮?
AJW 2014年

1
@AJW,如何使用xpath:driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
falsetru 2014年

1
@MortezaLSC,如果您的意思是在没有GUI的系统中有可能,则有可能。使用无头浏览器。例如,PhantomJS。
falsetru 2014年

30

试试这个:

下载firefox,添加插件“ firebug”和“ firepath”;安装它们后,转到您的网页,启动firebug并找到该元素的xpath,该元素在页面中是唯一的,因此您不会犯任何错误。

看图片: 指令

browser.find_element_by_xpath('just copy and paste the Xpath').click()


5
非常感谢您提供如此出色的Lifehack。它节省了很多时间
Hero Guy

这在Mac bc上不起作用吗?Firebug和fire path都没有显示为附件
Bob

有些时候它不是操作系统,但Firefox的版本有问题,最后版本的Firefox有一些问题FirePath,我使用的是Firefox 55.0.3
卡罗1585

1
您可以使用以下工具在Firefox上找到该元素:工具-> Web开发人员->检查器;点击在GUI上的按钮,在检查部分,右键单击与相关的代码-鼠标>复制,然后选择:CSS选择器/ CSS路径/ Xpath的...
尼尔

4

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

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

基本上,我已经在引号中添加了DIV标签的名称。


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'))

然后,您应该有两个文本文件,其中包含您所在的初始页面('output_init.txt')和单击按钮后被转发到的页面('output_dest.txt')。如果它们相同,那么是的,您的代码无效。如果不是,则您的代码有效,但是您还有另一个问题。对我来说,问题似乎是尚未执行将内容转换为钩子的必需javascript。

您所看到的选择:

  1. 让驱动程序执行javascript,然后调用您的find元素代码。在stackoverflow上查找有关此问题的更详细的答案,因为我没有遵循这种方法。
  2. 只需在'output_dest.txt'上找到一个类似的钩子,即可产生相同的结果,这就是我所做的。
  3. 尝试稍等一下再单击任何内容:

xpath2 =“您要单击的xpath”

WebDriverWait(驱动程序,超时= 5)。直到(lambda x:x.find_element_by_xpath(xpath2))

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


1

打开一个网站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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.