Ошибка селена веб-драйвера на send_keys (Keys.ENTER) - PullRequest
2 голосов
/ 10 мая 2019
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(r"C:\Users\m\Desktop\python\selen\chromedriver.exe")
driver.set_page_load_timeout(10)
driver.get("https://google.com")
driver.find_element_by_name("q").send_keys("Automation")
driver.find_element_by_name("btnk").send_keys(keys.ENTER)
time.sleep(4)
driver.quit()

Я пытаюсь с помощью этого простого кода открыть страницу Google и выполнить поиск по слову «автоматизация», но я получаю такой результат, и программа останавливается на этой строке: driver.find_element_by_name("btnk").send_keys(keys.ENTER)

Traceback (most recent call last):
  File "C:\Users\m\Desktop\python\selen\auto.py", line 9, in <module>
    driver.find_element_by_name("btnk").send_keys(keys.ENTER)
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 496, in find_element_by_name
    return self.find_element(by=By.NAME, value=name)
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"name","selector":"btnk"}
  (Session info: chrome=74.0.3729.131)
  (Driver info: chromedriver=74.0.3729.6 (255758eccf3d244491b8a1317aa76e1ce10d57e9-refs/branch-heads/3729@{#29}),platform=Windows NT 10.0.17134 x86_64)

В чем проблема?

Ответы [ 2 ]

3 голосов
/ 10 мая 2019

Пожалуйста, проверьте 'find_element_by_name' для кнопки поиска или используйте xpath.

Я запускаю скрипт в Java. Надеюсь, это поможет вам ...

И для поиска xpath использование селен IDE .

Selenium IDE

и код ниже: -

WebDriver driver =new FirefoxDriver();
driver.get("https://www.google.com");

WebDriverWait wait = new WebDriverWait (driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@name='q']")));

WebElement ele = driver.findElement(By.xpath("//input[@name='q']"));
ele.sendKeys("q");
driver.findElement(By.xpath("(//input[@name='btnK'])[2]")).sendKeys(Keys.ENTER);

и одно предложение drop 'thread.sleep' , потому что оно останавливает программу на указанное время.

Thread.sleep () :В спящем коде всегда будут ждать указанные секунды в скобках, даже если рабочая страница готова через 1 секунду.Таким образом, это может замедлить тестирование.

Явное ожидание : Явное ожидание - это своего рода ожидание определенного условия, прежде чем продолжить работу в коде.

Неявное ожидание : Неявное ожидание - это сказать WebDriver, чтобы он запрашивал DOM в течение определенного времени при попытке найти элемент или элементы, если они не доступны сразу.По умолчанию установлено значение 0

. Рекомендуется ли использовать Thread.sleep во время теста на селен?

Отредактировано:

также см. Этот https://stackoverflow.com/a/56078618/4513879 ответ.

Element is not reachable by keyboard в простых словах означает, что элемент не может быть достигнут с помощью клавиатуры, что означает, что вы не будете физически взаимодействовать с ним даже. Избегайте использования JS-кликов.Пользователь не может щелкнуть элемент, который не виден, скрыт или находится за пределами экрана и т. Д. Selenium был разработан, чтобы действовать как пользователь и выдавать ошибки, когда пользователь не может щелкнуть элемент.

Для получения дополнительной информации, пожалуйста, пройдите https://stackoverflow.com/a/49872160/4513879 этот ответ.

Обновленный код: -

WebDriver driver =new FirefoxDriver();
driver.get("https://www.google.com");

WebDriverWait wait = new WebDriverWait (driver, 30);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//input[@name='q']")));

WebElement ele = driver.findElement(By.xpath("//input[@name='q']"));
ele.sendKeys("q");

new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.name("btnK"))).click();

в приведенном выше коде я добавил new WebDriverWait(driver,20).until(ExpectedConditions.elementToBeClickable(By.name("btnK"))).click(); эту строку.

1 голос
/ 10 мая 2019

К должно быть прописным. Чувствителен к регистру

Изменить это:

driver.find_element_by_name("btnk").send_keys(keys.ENTER)

К этому:

driver.find_element_by_name("btnK").send_keys(keys.ENTER)

Некоторые другие наблюдения ... Похоже, что есть два элемента с одинаковыми атрибутами, поэтому у вас могут возникнуть проблемы с этим.

В качестве возможного решения этой проблемы вы можете попробовать это вместо find_element_by_name:

from selenium.webdriver.support import expected_conditions as EC

EC.element_to_be_clickable(By.name("btnK"))).click()

Кроме того, с кнопками, я думаю, вы захотите click вместо send_keys

Приветствия:)

...