简体   繁体   中英

How to find and click the button by "onclick" with Selenium and Python?

There are 2 buttons in a page, and the difference between these 2 buttons is "onclick" .

<button class="btn btn-primary" style="width: 96px;" type="button" id="YesBtn" onclick="check_security('security_div0')">OK</button>

<button class="btn btn-primary" style="width: 96px;" type="button" id="YesBtn" onclick="check_security('wlan1security_div0')">OK</button>

I was thinking to use xpath :

driver.find_element_by_xpath("//form[@id='update-container-id']/div/div/div/div[2]/div/div[2]/table[1]/tbody/tr[1]/td[8]/div[3]/div/div/div/div[3]/button").click()

But it responses the error as below:

selenium.common.exceptions.ElementNotInteractableException: Message: Element <button id="YesBtn" class="btn btn-primary" type="button"> could not be scrolled into view

Does anyone can help me to click the 2nd button correctly? Thanks a lot.

try with the x-path //button[@onclick="check_security('wlan1security_div0')"]

driver.find_element_by_xpath("//button[@onclick=\"check_security('wlan1security_div0')\"]").click()

Using Action class,

button = driver.find_element_by_xpath("//button[@onclick=\"check_security('wlan1security_div0')\"]")
ActionChains(driver).move_to_element(button).click(button).perform()

using java script executor,

driver.execute_script("javascript:check_security('wlan1security_div0')")

As per the HTML you have provided, to click on the button using the onclick() event you can use the following solution:

  • First Element(css_selector):

     driver.find_element_by_css_selector("button.btn.btn-primary#YesBtn[onclick*='security_div0']").click()
  • First Element(xpath):

     driver.find_element_by_xpath("//button[@class='btn btn-primary' and @id='YesBtn'][@onclick=\\"check_security('security_div0')\\"]").click()
  • Second Element(css_selector):

     driver.find_element_by_css_selector("button.btn.btn-primary#YesBtn[onclick*='wlan1security_div0']").click()
  • Second Element(xpath):

     driver.find_element_by_xpath("//button[@class='btn btn-primary' and @id='YesBtn'][@onclick=\\"check_security('wlan1security_div0')\\"]").click()

First and foremost, you are using a really long xpath which will be difficult to maintain. You can narrow it down further.

Now, some xpaths you can try:

1) Get the second button with the id YesBtn (assuming there are only two buttons with that attribute) :

driver.find_element_by_xpath("(//button[@id= 'YesBtn'])[2]");

2) Find by the onclick attribute:

driver.find_element_by_xpath("//button[@onclick= \'check_security(\'wlan1security_div0\')\']");

button1 with HTML :

<button class="btn btn-primary" style="width: 96px;" type="button" id="YesBtn" onclick="check_security('security_div0')">OK</button>  

XPATH :

//button[text()='OK' and @onclick="check_security('security_div0')"] 

button2 with HTML :

<button class="btn btn-primary" style="width: 96px;" type="button" id="YesBtn" onclick="check_security('wlan1security_div0')">OK</button>  

HTML:

//button[text()='OK' and @onclick="check_security('wlan1security_div0')"]
try:
  buttonVar = browser.find_element_by_css_selector(cssSel)
  ActionChains(browser).move_to_element(buttonVar).click(buttonVar ).perform()

except Exception as ex:
  print("button not found)

Firefox gives you several option you can use with selenium find_element or elements;

  1. by pressing f12 to bring up the inspector,
  2. use the "pick an item" icon in the left corner to select the item you want to view.
  3. This will highlight the text for that item in the inspector, which you can then right click on to bring up a menu where you select "copy" where there are at least 2 find_element options, css_selecor & xpath.

I personally don't like xpath. They are sometimes long & unruly to work with but whatever suits your style. In my case css_selector works fine.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM