无法获取正确的 WebElement 标识符(在 iCloud.com 上登录)

Posted

技术标签:

【中文标题】无法获取正确的 WebElement 标识符(在 iCloud.com 上登录)【英文标题】:Can not take correct identifier of WebElement (Sign in at iCloud.com) 【发布时间】:2020-04-05 17:17:51 【问题描述】:

我无法识别“使用 Apple ID 登录”元素(在 iclod.com 页面上)。

这是我现在使用的:

WebElement username = driver.findElement(By.xpath("//[@id=\"account_name_text_field\"]");
username.sendKeys("my_email@icloud.com");

另外,我尝试使用由 Chropath 和 Ranorex 创建的 CSS,但仍然无法正常工作。 我做错了什么?

Path to needed Element

【问题讨论】:

你试过 By.cssSelector("#account_name_text_field") 吗? 【参考方案1】:

请检查以下解决方案。 iframe 与您的网页相关联,您需要先切换到 iframe,然后再与网页元素输入框交互。

driver = webdriver.Chrome(executable_path=r" path of chromedriver.exe")
driver.maximize_window()
wait = WebDriverWait(driver, 10)
driver.get("https://www.icloud.com")
wait.until(EC.presence_of_element_located((By.ID, "auth-frame")))
driver.switch_to.frame("auth-frame")
inputBox = wait.until(EC.element_to_be_clickable((By.ID, "account_name_text_field")))
inputBox.send_keys("your test")

# switch back to main window
driver.switch_to.default_content()

输出:

【讨论】:

您是否愿意 accept 回答您的问题。【参考方案2】:

元素在iframe里面,需要先切换。

你可以使用.frameToBeAvailableAndSwitchToIt:

driver.get("https://www.icloud.com/");
new WebDriverWait(driver, 20).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("auth-frame")));
WebElement username = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.id("account_name_text_field")));
username.sendKeys("my_email@icloud.com");

添加WebDriverWait,网页加载比较长。

【讨论】:

【参考方案3】:

iframe 可能很棘手。在访问该文本框之前,您必须将焦点更改为框架。 使用switchTo().frame();

可以采用以下参数:

    switchTo().frame(int frame number):定义帧索引号, 驱动程序将切换到该特定帧 switchTo().frame(字符串 frameNameOrId):定义框架元素或 Id,Driver 将 切换到该特定框架 switchTo().frame(WebElement frameElement): 定义框架 web 元素,Driver 将 切换到该特定框架

WebDriver driver = new FirefoxDriver();
waitdriver = new WebDriverWait(driver , 10);
driver.get("https://www.icloud.com/");
driver.switchTo().frame("auth-frame"); 
waitdriver.until(ExpectedConditions.presenceOfElementLocated( By.xpath("//*[@id=\"account_name_text_field\"]")));
WebElement textbox=driver.findElement(By.xpath("//*[@id=\"account_name_text_field\"]"));
textbox.click();
textbox.sendKeys("HelloWorld@gmail.com");

【讨论】:

【参考方案4】:

1) 你写的 xpath 模式是错误的。 2) 在您的脚本中使用之前,您始终可以在 ChroPath 中验证 xpath 或 cssSelector。 3) 如果元素在 iframe 内,那么您必须在 ChroPath 中获得 iframe xpath 以及元素 xpath。请使用它们。 请按照此视频教程充分利用 ChroPath 的 iframe feature。

【讨论】:

以上是关于无法获取正确的 WebElement 标识符(在 iCloud.com 上登录)的主要内容,如果未能解决你的问题,请参考以下文章

无法获取元素 SELENIUM PYTHON

如何在 Selenium 中获取 WebElement 的 HTML 代码

webElement.text()获取到内容为空

WebElement接口获取值

返回值无法转换为 WebElement

selenium与页面交互之二:webelement类的属性