trăn selen bấm vào nút


84

Tôi còn khá mới đối với python selen và tôi đang cố gắng nhấp vào nút có cấu trúc html sau:

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

Tôi muốn có thể nhấp vào cả hai nút SearchResetở trên (rõ ràng là riêng lẻ).

Tôi đã thử một vài điều, ví dụ:

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

hoặc là,

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

hoặc là,

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

nhưng, tôi dường như luôn kết thúc với NoSuchElementException, ví dụ:

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

Tôi đang tự hỏi liệu bằng cách nào đó tôi có thể sử dụng các thuộc tính onclick của HTML để thực hiện nhấp chuột selen không?

Bất kỳ suy nghĩ nào có thể chỉ dẫn tôi đi đúng hướng sẽ rất tuyệt. Cảm ơn.

Câu trả lời:


15

Đối với python, hãy sử dụng

from selenium.webdriver import ActionChains

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

102

Xóa không gian giữa các lớp trong bộ chọn 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
Tôi đã thử những gì bạn đã đề xuất. Tôi nhận được cùng một NoSuchElementExceptionlỗi!
AJW

2
@AJW, Hãy thử print(driver.page_source)và kiểm tra html thực sự chứa phần tử.
falsetru

Cảm ơn. Tôi đã làm print(driver.page_source)và thấy rằng nó được đặt tên khác. Thật kỳ lạ. Nó nhấp vào bây giờ khi tôi loại bỏ khoảng trắng và đổi tên. Tiếp theo sau: như bạn có thể thấy ngay cả nút đặt lại và nút tìm kiếm đều giống nhau class: làm thế nào để phân biệt giữa nút tìm kiếm và nút đặt lại khi nhấp trong trường hợp này?
AJW

1
@AJW, Làm thế nào aobut sử dụng xpath:driver.find_element_by_xpath('.//div[@class="button c_button s_button"][contains(., "Search")]')
falsetru

1
@MortezaLSC, Nếu bạn có nghĩa là nó có thể xảy ra trong hệ thống không có GUI, thì có thể. Sử dụng trình duyệt không có đầu. Ví dụ, PhantomJS.
falsetru

30

thử đi:

tải xuống firefox, thêm plugin "firebug" và "firepath"; sau khi cài đặt chúng, hãy truy cập trang web của bạn, khởi động firebug và tìm xpath của phần tử, nó là duy nhất trong trang để bạn không thể mắc lỗi.

Xem tranh: chỉ dẫn

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


5
Cảm ơn bạn rất nhiều vì một cuộc sống tuyệt vời như vậy. Nó tiết kiệm được nhiều giờ
Anh chàng anh hùng

điều này không hoạt động trên mac bc, cả firebug và fire path đều không hiển thị dưới dạng tiện ích bổ sung
Bob

Một thời gian đó không phải là vấn đề của hệ điều hành nhưng Firefox phiên bản, cuối cùng phiên bản Firefox có một số vấn đề với FirePath, Tôi đang sử dụng Firefox 55.0.3
Carlo 1585

1
Bạn có thể tìm thấy phần tử trên Firefox bằng cách sử dụng: Tools-> Web Developer-> Inspector; nhấp vào nút tại GUI, trên phần thanh tra, nhấp chuột phải vào mã có liên quan-> sao chép và chọn: CSS Selector / CSS Path / Xpath ...
Nir

4

Tôi đã gặp sự cố tương tự khi sử dụng Phantomjs làm trình duyệt, vì vậy tôi đã giải quyết theo cách sau:

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

Về cơ bản, tôi đã thêm tên của thẻ DIV vào phần trích dẫn.


2

Quy trình gỡ lỗi sau đây đã giúp tôi giải quyết vấn đề tương tự.

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

Sau đó, bạn sẽ có hai tệp văn bản với trang đầu tiên bạn đang truy cập ('output_init.txt') và trang bạn đã được chuyển tiếp đến sau khi nhấp vào nút ('output_dest.txt'). Nếu chúng giống nhau, thì đúng là mã của bạn không hoạt động. Nếu không, thì mã của bạn đã hoạt động, nhưng bạn gặp sự cố khác. Vấn đề đối với tôi dường như là javascript cần thiết để chuyển đổi nội dung để tạo ra hook của tôi vẫn chưa được thực thi.

Các tùy chọn của bạn như tôi thấy:

  1. Yêu cầu trình điều khiển thực thi javascript và sau đó gọi mã phần tử tìm của bạn. Tìm câu trả lời chi tiết hơn về vấn đề này trên stackoverflow, vì tôi đã không làm theo phương pháp này.
  2. Chỉ cần tìm một móc có thể so sánh trên 'output_dest.txt' sẽ tạo ra kết quả tương tự, đó là những gì tôi đã làm.
  3. Hãy thử đợi một chút trước khi nhấp vào bất kỳ thứ gì:

xpath2 = "xpath của bạn mà bạn sẽ nhấp vào"

WebDriverWait (trình điều khiển, thời gian chờ = 5) .until (lambda x: x.find_element_by_xpath (xpath2))

Cách tiếp cận xpath không nhất thiết phải tốt hơn, tôi chỉ thích nó hơn, bạn cũng có thể sử dụng cách tiếp cận bộ chọn của mình.


1

mở một trang web https://adviserinfo.sec.gov/compilation và nhấp vào nút để tải xuống tệp và thậm chí tôi muốn đóng cửa sổ bật lên nếu nó sử dụng python selen

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.