Ошибка при поиске элемента в selenium python webdriver - PullRequest
0 голосов
/ 07 мая 2020

Я начал с Selenium Webdriver и пытался открыть google.com, а затем нажать кнопку «Поиск в Google». Я получил элемент кнопки, используя chropath, а ниже мой код

from selenium import webdriver
b = webdriver.Chrome()
b.get("http://google.com")
c = b.find_element_by_name("btnk")
c.click()

Получение ошибки как

 raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"css selector","selector":"[name="btnk"]"}
  (Session info: chrome=81.0.4044.138)

Скриншот chropath

enter image description here

Изменить:

Ниже приведен код для нажатия на «Мне повезет»

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
import time

b = webdriver.Chrome()
b.get("http://google.com")
timeout = 3
try:
    element_present = EC.presence_of_element_located((By.XPATH, "//div[@class='FPdoLc tfB0Bf']//input[@name='btnI']"))
    WebDriverWait(b, timeout).until(element_present)
    c = b.find_elements_by_xpath("//div[@class='FPdoLc tfB0Bf']//input[@name='btnI']")
    print("Value of c ", c)
    for i in c:
        print (i)
    c[0].click()
except TimeoutException:
    print("Timed out")

Это работает, но почему c - это список .

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

Если вы видите DOM, вы найдете два элемента для кнопки ввода с именем btnK и btnI Induce WebDriverWait () и дождитесь element_to_be_clickable () и следующего xpath.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

b = webdriver.Chrome()
b.get("http://google.com")
#Close the cookie if there..If not ignore
WebDriverWait(b,5).until(EC.element_to_be_clickable((By.XPATH,"//*[text()='Remind me later']"))).click()

#Click on Google Search
gsearch=WebDriverWait(b,5).until(EC.element_to_be_clickable((By.XPATH,"(//input[@name='btnK'])[last()]")))
gsearch.click()

Imluckuy=WebDriverWait(b,5).until(EC.element_to_be_clickable((By.XPATH,"(//input[@name='btnI'])[last()]")))
Imluckuy.click()
0 голосов
/ 07 мая 2020

Я считаю, что проблема в том, что вы не ждете загрузки представления, прежде чем найти элемент. Вы можете использовать Explicit Timeout , чтобы подождать, пока btnK не появится в представлении.

Используйте WebDriverWait до presence_of_element_located. Тайм-аут можно настроить в зависимости от состояния сети. Видно, что в html есть два элемента с именем btnK. Хотя я не знаю причины этого, но виден только один из них, поэтому для щелчка используется c[1].

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import time

b = webdriver.Chrome()
b.get("http://google.com")
timeout = 3
try:
    element_present = EC.presence_of_element_located((By.NAME, 'btnK'))
    WebDriverWait(b, timeout).until(element_present)
    c = b.find_elements_by_name("btnK")
    c[1].click()
except TimeoutException:
    print("Timed out")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...