简体   繁体   English

Selenium Web驱动程序:如何单击按钮?

[英]Selenium web driver: How do I click on the button?

<button style="margin: 8px 5px 0 0; height: 40px;" 
class="gprospect_linkedin_button gprospect_linkedin_button_style_medium"> 
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyhpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTM4IDc5LjE1OTgyNCwgMjAxNi8wOS8xNC0wMTowOTowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6RUM5NDk2ODA2NjYzMTFFOEIxMDBFQzUxNzIzRTMwQTMiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6RUM5NDk2ODE2NjYzMTFFOEIxMDBFQzUxNzIzRTMwQTMiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpFQzk0OTY3RTY2NjMxMUU4QjEwMEVDNTE3MjNFMzBBMyIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpFQzk0OTY3RjY2NjMxMUU4QjEwMEVDNTE3MjNFMzBBMyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgdDInEAAAmaSURBVHja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">Get email
</button>

Tried the code below but element cannot be found: 尝试以下代码,但找不到元素:

driver.find_element_by_class_name('gprospect_linkedin_button').click()

The actual class name is 'gprospect_linkedin_button gprospect_linkedin_button_style_medium' 实际的类名称为“ gprospect_linkedin_button gprospect_linkedin_button_style_medium”

find_element_by_class_name function is designed to get the element by the full class-name. find_element_by_class_name函数旨在通过完整的类名获取元素。

You can try to locate it with xpath like this: 您可以尝试使用xpath找到它,如下所示:

//button[contains(@class, 'gprospect_linkedin_button')];

You can use xpath starts-with function to solve this issue. 您可以使用xpath starts-with函数来解决此问题。 like: 喜欢:

//*[starts-with(., 'gprospect_linkedin_button')]

As per the configuration details (within your comment update) ... 根据配置详细信息(在您的评论更新内)...

(Session info: chrome=69.0.3497.100) 
(Driver info: chromedriver=2.37.543627 (63642262d9fb93fb4ab52398be4286d844092a5e),platform=Windows NT 6.3.9600 x86_64) 

Your main issue is the incompatibility between the version of the binaries you are using as follows: 您的主要问题是所使用的二进制版本之间的不兼容性 ,如下所示:

  • You are using chromedriver=2.37 您正在使用chromedriver = 2.37
  • Release Notes of chromedriver=2.37 clearly mentions the following : chromedriver = 2.37发行说明明确提到以下内容:

Supports Chrome v64-66 支持Chrome v64-66

Supports Chrome v68-70 支持Chrome v68-70

So there is a clear mismatch between ChromeDriver v2.37 and the Chrome Browser v69.0 因此, ChromeDriver v2.37Chrome浏览器v69.0之间明显不匹配

Solution

  • Upgrade ChromeDriver to current ChromeDriver v2.42 level. 升级ChromeDriver当前ChromeDriver v2.42水平。
  • Keep Chrome version between Chrome v68-70 levels. Chrome版本保持在Chrome v68-70之间。 ( as per ChromeDriver v2.42 release notes ) 根据ChromeDriver v2.42发行说明
  • Clean your Project Workspace through your IDE and Rebuild your project with required dependencies only. 通过IDE 清理 项目工作区 ,并仅使用必需的依赖项重建项目。
  • If your base Web Client version is too old, then uninstall it through Revo Uninstaller and install a recent GA and released version of Web Client . 如果您的基本Web客户端版本太旧,请通过Revo Uninstaller卸载它,并安装最新的GA和Web Client的发行版本。
  • Use the following line of code to invoke click() on the desired element: 使用以下代码行在所需元素上调用click()

     driver.find_element_by_xpath("//button[@class='gprospect_linkedin_button gprospect_linkedin_button_style_medium'][normalize-space()='Get email']").click() 
  • Execute your @Test . 执行您的@Test


Update A 更新A

As you are still seeing NoSuchElementException after the binary update you need to induce WebDriverWait for the desired element to be clickable as follows: 二进制更新后,您仍然看到NoSuchElementException ,因此需要诱使WebDriverWait使所需元素可单击 ,如下所示:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# other lines of code
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='gprospect_linkedin_button gprospect_linkedin_button_style_medium'][normalize-space()='Get email']"))).click()

Update B 更新B

As you are still unable to click() you need to use execute_script() method as follows: 由于您仍然无法click() ,因此需要使用execute_script()方法,如下所示:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
# other lines of code
myElement = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@class='gprospect_linkedin_button gprospect_linkedin_button_style_medium'][normalize-space()='Get email']")))
driver.execute_script("arguments[0].click();", myElement)

尝试这个:

driver.find_element_by_xpath("//*[contains(local-name(), 'button') and contains(@class, 'gprospect_linkedin_button')]").click()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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