Python + Selenium - 无法访问网页上的元素

时间:2018-01-07 20:26:36

标签: python html selenium xpath

我正在尝试访问Selenium中的一个元素,但是没有一个典型的方法可以正常工作。到目前为止,我尝试使用'find_elements_by_x'的每个变体都没有成功。我也花了大约一天时间查看各种论坛,但似乎没有任何工作。我最近在另一个成功的项目中使用了Selenium,但是同样的结构对于这个特定的网站并不适用。这是HTML的片段,其中包含我尝试访问的元素:

<input type="text" name="username" id="username" placeholder="Username / 
Email" autocapitalize="off" autocorrect="off" required="" ng-
model="credentials.username" class="ng-pristine ng-invalid ng-invalid-
required">

很明显,这是一个用于登录的用户名输入。以下是我迄今为止尝试过的几行没有用的。

from selenium import webdriver


driver = webdriver.Chrome("chromedriver.exe filepath")
driver.get('url')

username = driver.find_element_by_xpath('//input[@id="username"]')

如果我使用Chrome中的控制台搜索它,XPath会导航到相关元素。

我也尝试过:

username = driver.find_element_by_name('username')

也没用。

我对Selenium很新,我对HTML没有任何经验,所以我不知道在通过Selenium查找元素时是否存在必须考虑的HTML中的复杂问题。任何帮助都表示赞赏。这也是我第一次在这里发帖,所以我希望我没有违反任何规则。

3 个答案:

答案 0 :(得分:0)

看起来输入框需要几秒钟才能加载。尝试在请求之前延迟:

driver.implicitly_wait(3)

如果这不起作用,请一次增加括号中的数字。如果这样可以解决问题,您可以改为明确等待。

答案 1 :(得分:0)

请尝试以下代码:

from selenium import webdriver
from selenium.webdriver.support import ui
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By


options = Options()
options.add_argument("unlimited-storage")
driver = webdriver.Chrome(chrome_options=options)

driver.get("http://www.runescape.com/companion/comapp.ws")

iframe = ui.WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.TAG_NAME, "iframe")))

# Switch to the frame.
driver.switch_to.frame(iframe)

username = ui.WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "username")))

print(username)

# Switch to the main content.
driver.switch_to.default_content()

driver.quit()

希望它可以帮到你!

答案 2 :(得分:0)

根据您共享的HTMLWebElementAngular元素,因此您必须为元素引导WebDriverWait,如下所示:

  • CSS_SELECTOR

    username = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.ng-pristine.ng-invalid.ng-invalid-required#username")))
    
  • XPATH

    username = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class='ng-pristine ng-invalid ng-invalid-required' and @id='username']")))