如何在Selenium中找到框架中的元素

时间:2017-11-05 10:17:07

标签: selenium selenium-webdriver

我使用下面的代码来查找框架中的元素,但是我收到了错误 请通过这个framebyinedex,framebystring,framebywebelement:

来解释
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver;

public class Framebyindex 
{
    public static void main(String[] args) 
    {
        WebDriver f1=new FirefoxDriver();
        f1.get("http://spicareers.com/spicareers/");
        f1.switchTo().frame(1);
        f1.findElement(By.linkText(" .Net - Senior Developer ")).click();
    }
}

错误是:

  

线程中的异常" main" org.openqa.selenium.NoSuchElementException:无法找到元素:{"方法":"链接文本","选择器":" .Net - 高级开发人员"}

6 个答案:

答案 0 :(得分:1)

NoSuchElementException只是意味着,selenium没有检测到您提出的文本链接。

我建议您使用by.xpath来解决它。要获取元素的xpath,请在chromefirefox浏览器上执行以下步骤。

  1. 右键单击元素(此处为链接)

  2. 点击inspect。它会在浏览器中打开检查控制台(Elements选项卡),并突出显示单击的元素。

  3. 右键单击元素选项卡中的元素

  4. 选择复制

  5. 复制Xpath

  6. 在您的代码中,将By.linkText替换为By.xpath

  7. 将值作为字符串粘贴到xpath("you paste here")

  8. 或者更简单,请观看this视频

答案 1 :(得分:1)

在必须切换到框架之前:

H1

然后你可以尝试:

W1

最后,如果你想切换回来:

        driver.get("http://spicareers.com/spicareers/");
        WebElement frame= driver.findElement(By.xpath("//frame[@name='JRAMPSMainFrame']"));
        driver.switchTo().frame(frame);

修改

感兴趣的元素位于iframe中,名称为" JRAMPSMainFrame"。如果你检查你的html,你会注意到这一点:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

答案 2 :(得分:1)

似乎您选择了错误的框架,或者链接文本可能包含更多空格。

Chrome开发者工具是您在这种情况下最好的朋友。用它来正确找到元素并识别框架。

  

选择框架

  1. 以chrome格式打开应用程序。
  2. 打开开发人员工具
  3. 点击开发者工具的控制台标签

  4. 从下拉菜单中选择您的框架 frame selector

  5. 在上图中只有一帧。

      

    找到元素

    1. 选择框架后,键入-(void)updateLastMessageSeenTime:(NSString*)groupID { FIRDataSnapshot *snapshot = [self.messageArray lastObject]; NSUserDefaults *lastSeenMessageTimeUserDefaults = [NSUserDefaults standardUserDefaults]; NSString *key = @"lastMessageTimeArrayKey"; NSMutableDictionary *lastSeenMessageTime = [[lastSeenMessageTimeUserDefaults objectForKey: key] mutableCopy]; if (!lastSeenMessageTime) { lastSeenMessageTime = [[NSMutableDictionary alloc] init]; } NSString *lastMessageTime = snapshot.value[@"timeStamp"]; [lastSeenMessageTime setValue:lastMessageTime forKey:groupID]; NSUserDefaults *lastSeenMessageTimeUserDefaults = [NSUserDefaults standardUserDefaults]; [lastSeenMessageTimeUserDefaults setObject:lastSeenMessageTime forKey: key]; [lastSeenMessageTimeUserDefaults synchronize]; } 以检查xpath。
    2. $x("//a[normalize-space(.) = '.Net - Senior Developer']")是在浏览器中检查xpath的函数。

      使用上述机制找到框架和元素。

      干杯!

答案 3 :(得分:0)

如果您仔细查看HTML http://spicareers.com/spicareers/ WebElement .Net - Senior Developer<iframe>文字在WebElement标记内。因此,在访问预期frame之前,我们必须先通过frame_nameframe_idframe_index切换到System.setProperty("webdriver.chrome.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); WebDriver driver = new FirefoxDriver(); driver.get("http://spicareers.com/spicareers/"); driver.switchTo().frame("JRAMPSMainFrame"); //using "frame_name" WebElement elem = driver.findElement(By.xpath("//*[contains(text(), ' .Net - Senior Developer ')]")); elem.click(); ,如下所示:

    private void parseJsondata(String response) {
                try {
                    // response
                    JSONObject jsonObject = new JSONObject(response);
                    // get data from JSONArray
                    JSONArray data = jsonObject.getJSONArray("data");
                    // for loop to your JSONArray's Strings
                    for (int i = 0; i < data.length(); i++) {
                        //  get JSONObject from i
                        JSONObject jo = data.getJSONObject(i);
                        // get string
                        String ean = jo.getString("ean");
                        String itemname = jo.getString("itemname");
                        String location = jo.getString("location");
                        JSONArray jA = jo.getJSONArray("po");
                        for (int j = 0; j < jA.length(); j++) {
                            //  get JSONObject by jO
                            JSONObject jO = jA.getJSONObject(i);
                            // get string
                            String ponumber = jO.getString("ponumber");
                            String qty = jO.getString("qty");
                        }

                    }
                    //Log response
                    Log.e("response:", response);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

答案 4 :(得分:0)

您可以使用此代码,首先使用name定位器进入框架,然后尝试找到职业选项

试试这段代码,我修改了你的代码:

public class Framebyindex 
{
    public static void main(String[] args) 
    {
        WebDriver f1=new FirefoxDriver();
        f1.get("http://spicareers.com/spicareers/");
        f1.switchTo().frame( f1.findElement(By.name("JRAMPSMainFrame")));
WebElement netCareer= f1.findElement(By.xpath("//*[contains(text(), ' .Net - Senior Developer ')]"));
        netCareer.click();
    }
}

答案 5 :(得分:0)

使用: https://github.com/nick318/FindElementInFrames

您可以编写以下内容:

    SearchByFramesFactory searchFactory = new SearchByFramesFactory(driver);
    
    SearchByFrames searchInFrame = searchFactory.search(() -> driver.findElement(By.xpath("//*[contains(text(), ' .Net - Senior Developer ')]")));
    searchInFrame.getElem().ifPresent(WebElement::click);