我正在使用 tumblr 测试我的应用程序,在执行程序时我必须登录和退出。这样做时,我无法单击不断弹出的复选框。如何在python中使用selenium-webriver来点击它?
我尝试过选择 xpaths、...by_ids 和 by_classes,它们不起作用,所以现在我尝试使用鼠标的坐标来物理单击该项目。 (这是在 tumblr 登录页面上,仅供参考)
上面是我要选择的项目的 html。
(编辑:) 我有以下选择器:
#checkbox = driver.find_element_by_id("recaptcha-anchor")
#checkbox = driver.find_element_by_id("g-recaptcha")
#driver.find_element_by_xpath("//*[@id='recaptcha-token']")
#driver.find_element_by_css_selector("#recaptcha-anchor")
#driver.find_element_by_xpath("//*[@id='recaptcha-anchor']")
#driver.find_element_by_id("recaptcha-token").click()
#driver.find_element_by_class_name('rc-anchor-center-container')
#checkbox = driver.find_element_by_id("recaptcha-anchor")
Google reCaptcha 是一个 iframe,因此您不能直接使用选择器。相反,请在 reCaptcha 之前选择一个元素,然后使用
send_keys
到 tab 到复选框,然后使用 space 勾选它。例如,请参阅下面最后一行代码。
注意:这会勾选验证码框,但不会解决问题,您仍然需要手动执行此操作。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
#modify line below to location of your chromedriver executable
chrome_path = r"/Users/Username/chromedriver"
driver = webdriver.Chrome(chrome_path)
driver.get("https://www.btcmarkets.net/login")
username = driver.find_element_by_id("userIdText")
username.send_keys("Us3rn4me")
password = driver.find_element_by_id("userPasswordText")
password.send_keys("Pa55w0rD")
#the line below tabs to the recaptcha tickbox and ticks it with the space bar
password.send_keys(Keys.TAB + Keys.TAB + " ")
看起来这不是一个输入标签。因此,可能操纵
aria-checked
属性并将其设置为 true
就可以了。更改属性值的唯一方法是 JavaScriptExecutor。尝试以下操作:
driver.execute_script("$('#recaptcha-anchor').setAttribute('aria-checked','true');")
使用下面的代码可以找到id为“recaptcha-anchor”的复选框并单击它,但无法绕过它。将会弹出以下图片。
List<WebElement> frames = driver.findElements(By.tagName("iframe"));
String winHanaleBefore = driver.getWindowHandle();
driver.switchTo().frame(0);
driver.findElement(By.id("recaptcha-anchor")).click();
driver.switchTo().window(winHanaleBefore);
这是一个在 Java 中适用于我的简单示例:
driver.findElement(By.id("checkbox_id")).click();
在Python中,似乎是:
driver.find_element_by_id("checkbox_id").click()