Как нажать на reCaptcha, используя Selenium и Java
Почему я получаю ошибки при попытке заставить драйвер нажать на reCaptcha
кнопка?
это сайт, на котором я пытаюсь заставить его работать: https://rsps100.com/vote/760/
Это мой текущий код:
WebElement iframeSwitch = driver.findElement(By.xpath("/html/body/div[1]/div/div[1]/div/div/div[2]/div/form/div/div/div/div/iframe"));
driver.switchTo().frame(iframeSwitch);
driver.findElement(By.cssSelector("div[class=recaptcha-checkbox-checkmark]")).click();
5 ответов
Вызывать click()
на флажок reCaptcha, как элемент находится в <iframe>
вам нужно:
- Индуцируйте WebDriverWait для желаемого frameToBeAvailableAndSwitchToIt.
- Индуцируйте WebDriverWait для нужного элемента ToBeClickable.
Вы можете использовать следующее решение:
Блок кода:
public class ReCaptcha_click { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\chromedriver.exe"); ChromeOptions options = new ChromeOptions(); options.addArguments("start-maximized"); options.addArguments("disable-infobars"); options.addArguments("--disable-extensions"); WebDriver driver = new ChromeDriver(options); driver.get("https://rsps100.com/vote/760"); new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@name, 'a-') and starts-with(@src, 'https://www.google.com/recaptcha')]"))); new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.recaptcha-checkbox-checkmark"))).click(); } }
Снимок браузера:
Это сработало для меня. Обратите внимание, что я использую Selenide. Для обычного селена код выглядит так же.
import static com.codeborne.selenide.Selenide.*;
void recaptchaTest() {
open("https://rsps100.com/vote/760");
switchTo().frame($x("//iframe[starts-with(@name, 'a-') and starts-with(@src, 'https://www.google.com/recaptcha')]"));
$("div.rc-anchor-content").click();
switchTo().defaultContent();
}
Использование WebDriverWait
чтобы определить элемент. Смотрите, если это поможет.
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@name,'a-')]")));
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("div.recaptcha-checkbox-checkmark")));
element.click();
Я решил это, может быть, глупым способом. Но имейте в виду, что я не нахожусь в тестовой среде и занимаюсь автоматизацией тестов. Итак, это мое решение:
Помимо использования
public void notABot( ) {
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds( 15 ));
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@name,'a-') and starts-with (@src, 'https://www.google.com/recaptcha')]")));
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div [ @class = 'recaptcha-checkbox-border']"))).click( );
driver.switchTo().defaultContent();
}
это, я также добавил пользовательский метод отправки ключей
public void inputEmail( ) {
inputEmail.click( );
String email = Strings.EMAIL_FOR_SIGNUP;
for (int i = 0; i < email.length(); i++) {
char c = email.charAt(i);
String s = new StringBuilder( ).append( c ).toString( );
inputEmail.sendKeys( s );
sleepSendKeys( );
}
}
Сон 300млн. В 96 процентах случаев мне удается обмануть google reCaptcha, что на самом деле человек входит на страницу. Это работа для меня
Вот код, который должен работать.
driver.switchTo().frame("a-9wt0e8vkopnm");
driver.findElement(By.xpath("//span[@id='recaptcha-anchor']")).click();